Перейти к основному содержимому

Агент резервного копирования Кибер Бэкап

Описание

Внимание!

В настоящее время сертификат совместимости Кибер Бэкап доступен только для мажорной версии 6 СУБД Pangolin.

В Кибер Бэкап механизм резервного копирования СУБД, включая восстановление на момент времени (Point-in-Time Recovery, PITR), реализован на базе стандартного протокола потоковой репликации. Резервные копии создаются через данный протокол с использованием физических слотов репликации, при этом поддержка потоковой репликации встроена непосредственно в специализированный агент Кибер Бэкап.

При необходимости также поддерживается традиционный для СУБД Pangolin подход к резервному копированию: создание полной файловой копии данных в сочетании с непрерывным архивированием WAL-файлов.

Стандартная функциональность агента Кибер Бэкап

Процесс резервного копирования с использованием агента Кибер Бэкап для СУБД организован по принципу, аналогичному созданию синхронной реплики в стандартной архитектуре СУБД Pangolin. Агент полностью поддерживает ключевые операторы протокола потоковой репликации.

Получение данных осуществляется через физический слот репликации, после чего агент выполняет необходимые операции — включая формирование WAL-файлов и передачу данных резервной копии.

Поддерживается создание как полной, так и инкрементальной копии базы данных. Все резервные данные, вместе с соответствующей метаинформацией, сохраняются на серверах хранения Кибер Бэкап.

Сценарии использования

В данном разделе приведены примеры выполнения полного и инкрементального резервного копирования, а также резервного копирования с включением WAL-файлов с использованием Кибер Бэкап.

Полное и инкрементальное резервное копирование

Подготовка к резервному копированию

Для выполнения прямого восстановления данных СУБД из резервной копии на стороне сервера-клиента требуется установленный агент Кибер Бэкап, включающий в себя следующие ключевые компоненты:

Подготовка к резервному копированию

примечание

Для корректной работы агента не требуется установка дополнительных системных пакетов, таких как компилятор GCC или исходные коды ядра операционной системы.

Наличие компилятора требуется только в случае сборки модуля ядра SnapAPI, используемого для операций с блочными устройствами Linux.

  1. Создание плана резервного копирования со стороны Кибер Бэкап:

  2. Создание базы данных cyber_test_db и таблицы cyber_test_tbl:

    $ psql -c "CREATE DATABASE cyber_test_db"

    CREATE DATABASE

    $ psql -d cyber_test_db -c "CREATE TABLE cyber_test_tbl (time timestamp default now(), text text);"

    CREATE TABLE
  3. Проверка состояния слотов репликации.

    Перед первым запуском резервного копирования слот репликации отсутствует, так как ранее процесс не выполнялся:

    $ psql -c "SELECT slot_name, slot_type, restart_lsn, temporary, active FROM pg_replication_slots;"

    slot_name | slot_type | restart_lsn | temporary | active
    -----------+-----------+-------------+-----------+--------
    (0 rows)
    примечание

    При создании полной резервной копии существующий слот репликации (если он присутствует) будет автоматически пересоздан с использованием команд DROP_REPLICATION_SLOT/CREATE_REPLICATION_SLOT.

Создание базовой резервной копии

  1. Создание записи test00 в таблице cyber_test_tbl:

    $ psql -d cyber_test_db -c "INSERT INTO cyber_test_tbl (text) VALUES ('test00');"

    INSERT 0 1

    Успешный результат – запись создана:

    $ psql -d cyber_test_db -c "SELECT * FROM cyber_test_tbl;"

    time | text
    ----------------------------+--------
    2024-11-06 08:08:28.995095 | test00
    (1 row)

    Снятие чек-суммы таблицы:

    $ psql -d cyber_test_db -c "SELECT md5(array_to_string(array_agg(cyber_test_tbl::text), ';')) FROM cyber_test_tbl;"

    md5
    ----------------------------------
    449126f8de37271f24f4462ca072f75c
    (1 row)
  2. Проверка текущего значения LSN (Log Sequence Number):

    • через протокол репликации:

      $ psql "dbname=cyber_test_db replication=database" -c "IDENTIFY_SYSTEM;"

      systemid | timeline | xlogpos | dbname
      ---------------------+----------+-----------+---------------
      7434028127449026963 | 1 | 0/1C2C0A0 | cyber_test_db
      (1 row)
    • через функции СУБД Pangolin:

      $ psql -c "SELECT pg_current_wal_lsn(), pg_current_wal_insert_lsn();"

      pg_current_wal_lsn | pg_current_wal_insert_lsn
      --------------------+---------------------------
      0/1C2C0A0 | 0/1C2C0A0
      (1 row)
  3. Запуск процесса резервного копирования:

    примечание

    При отсутствии слота репликации система всегда инициирует создание полной резервной копии, независимо от выбранного типа плана (полного или инкрементального).

  4. Проверка результатов выполнения резервного копирования:

    • завершение задания резервного копирования в web-консоли Кибер Бэкап:

    • наличие резервной копии в web-консоли Кибер Бэкап:

    • успешное создание слота репликации:

      $ psql -c "SELECT slot_name,slot_type,restart_lsn,temporary,active from pg_replication_slots;"

      slot_name | slot_type | restart_lsn | temporary | active
      --------------------------------------------------+-----------+-------------+-----------+--------
      cp_8bcrgpqlqs6vdybotq8reg_lx_n_jixtiittb0fivv_iq | physical | 0/2020000 | f | f
      (1 row)
    • текущие позиции LSN:

      $ psql "dbname=cyber_test_db replication=database" -c "IDENTIFY_SYSTEM;"

      systemid | timeline | xlogpos | dbname
      ---------------------+----------+-----------+---------------
      7434028127449026963 | 1 | 0/3000070 | cyber_test_db
      (1 row)

      $ psql -c "select pg_current_wal_lsn(), pg_current_wal_insert_lsn();"

      pg_current_wal_lsn | pg_current_wal_insert_lsn
      --------------------+---------------------------
      0/3000070 | 0/3000070
      (1 row)

Создание первой инкрементальной резервной копии

  1. Создание записи test01 в таблице cyber_test_tbl:

    $ psql -d cyber_test_db -c "INSERT INTO cyber_test_tbl (text) VALUES ('test01');"

    INSERT 0 1

    Успешный результат – запись создана:

    $ psql -d cyber_test_db -c "SELECT * FROM cyber_test_tbl;"

    time | text
    ----------------------------+--------
    2024-11-06 08:08:28.995095 | test00
    2024-11-06 08:13:32.064309 | test01
    (1 row)

    Снятие чек-суммы таблицы:

    $ psql -d cyber_test_db -c "SELECT md5(array_to_string(array_agg(cyber_test_tbl::text), ';')) FROM cyber_test_tbl;"

    md5
    ----------------------------------
    ebca67147d3d0a6e2500a55a4be19fdf
    (1 row)
  2. Запуск процесса резервного копирования и проверка результата в web-консоли Кибер Бэкап:

  3. Проверка результатов выполнения резервного копирования:

    • успешное создание слота репликации:

      $ psql -c "SELECT slot_name,slot_type,restart_lsn,temporary,active from pg_replication_slots;"

      slot_name | slot_type | restart_lsn | temporary | active
      --------------------------------------------------+-----------+-------------+-----------+--------
      cp_8bcrgpqlqs6vdybotq8reg_lx_n_jixtiittb0fivv_iq | physical | 0/30001A0 | f | f
      (1 row)
    • текущие позиции LSN:

      $ psql "dbname=cyber_test_db replication=database" -c "IDENTIFY_SYSTEM;"

      systemid | timeline | xlogpos | dbname
      ---------------------+----------+-----------+---------------
      7434028127449026963 | 1 | 0/4000000 | cyber_test_db
      (1 row)

      $ psql -c "select pg_current_wal_lsn(), pg_current_wal_insert_lsn();"

      pg_current_wal_lsn | pg_current_wal_insert_lsn
      --------------------+---------------------------
      0/4000000 | 0/4000028
      (1 row)

Создание второй инкрементальной резервной копии

  1. Создание записи test02 в таблице cyber_test_tbl:

    $ psql -d cyber_test_db -c "INSERT INTO cyber_test_tbl (text) VALUES ('test02');"

    INSERT 0 1

    Успешный результат – запись создана:

    $ psql -d cyber_test_db -c "SELECT * FROM cyber_test_tbl;"

    time | text
    ----------------------------+--------
    2024-11-06 08:08:28.995095 | test00
    2024-11-06 08:13:32.064309 | test01
    2024-11-06 08:16:11.917502 | test02
    (1 row)

    Снятие чек-суммы таблицы:

    $ psql -d cyber_test_db -c "SELECT md5(array_to_string(array_agg(cyber_test_tbl::text), ';')) FROM cyber_test_tbl;"

    md5
    ----------------------------------
    b80c6e2803f3a0f327e893f2c9ebdaef
    (1 row)
  2. Проверка текущего значения LSN (Log Sequence Number):

    • через протокол репликации:

      $ psql "dbname=cyber_test_db replication=database" -c "IDENTIFY_SYSTEM;"

      systemid | timeline | xlogpos | dbname
      ---------------------+----------+-----------+---------------
      7434028127449026963 | 1 | 0/40000E0 | cyber_test_db
    • через функции СУБД Pangolin:

      $ psql -c "SELECT pg_current_wal_lsn(), pg_current_wal_insert_lsn();"

      pg_current_wal_lsn | pg_current_wal_insert_lsn
      --------------------+---------------------------
      0/40000E0 | 0/40000E0
      (1 row)
  3. Запуск процесса резервного копирования и проверка результата в web-консоли Кибер Бэкап:

  4. Проверка результатов выполнения резервного копирования:

    • успешное создание слота репликации:

      $ psql -c "SELECT slot_name,slot_type,restart_lsn,temporary,active from pg_replication_slots;"

      slot_name | slot_type | restart_lsn | temporary | active
      --------------------------------------------------+-----------+-------------+-----------+--------
      cp_8bcrgpqlqs6vdybotq8reg_lx_n_jixtiittb0fivv_iq | physical | 0/40000E0 | f | f
      (1 row)
    • текущие позиции LSN:

      $ psql "dbname=cyber_test_db replication=database" -c "IDENTIFY_SYSTEM;"

      systemid | timeline | xlogpos | dbname
      ---------------------+----------+-----------+---------------
      7434028127449026963 | 1 | 0/5000000 | cyber_test_db
      (1 row)

      $ psql -c "select pg_current_wal_lsn(), pg_current_wal_insert_lsn();"

      pg_current_wal_lsn | pg_current_wal_insert_lsn
      --------------------+---------------------------
      0/5000000 | 0/5000028
      (1 row)

Восстановление из резервных копий

Восстановление базовой резервной копии test00
  1. Восстановление (в режиме «как файлы») полной резервной копии test00 во временный каталог на исходный сервер-клиент через web-консоль Кибер Бэкап:

    Успешный результат – резервная копия восстановлена:

  2. Запуск восстановленной резервной копии test00:

    $ pg_ctl -D /restore_dbms/test00 start

    waiting for server to start....2024-11-06 08:48:15 MSK [1700547]: [1-1] app=,user=,db=,client=,type=postmaster LOG: License type is "Enterprise"
    ...
    server started
  3. Проверка:

    • содержимого таблицы cyber_test_tbl:

      $ psql -p 5400 -d cyber_test_db -c "SELECT * FROM cyber_test_tbl;"

      time | text
      ----------------------------+--------
      2024-11-06 08:08:28.995095 | test00
      (1 row)
    • контрольной суммы данных:

      $ psql -p 5400 -d cyber_test_db -c "SELECT md5(array_to_string(array_agg (cyber_test_tbl::text), ';')) FROM cyber_test_tbl;"

      md5
      ----------------------------------
      449126f8de37271f24f4462ca072f75c
      (1 row)
  4. Сравнение чек-сумм до создания копии test00 и после восстановления:

    md5 hash
    До создания копии449126f8de37271f24f4462ca072f75c
    После восстановления449126f8de37271f24f4462ca072f75c

    Совпадение чек-сумм подтверждает, что данные восстанавливаются корректно и полностью соответствуют состоянию на момент создания резервной копии.

Восстановление инкрементальной резервной копии test01
  1. Восстановление (в режиме «как файлы») инкрементальной резервной копии test01 во временный каталог на исходный сервер-клиент через web-консоль Кибер Бэкап.

  2. Запуск восстановленной резервной копии test01:

    $ pg_ctl -D /restore_dbms/test01 start

    waiting for server to start....2024-11-06 09:11:45 MSK [1700621]: [1-1] app=,user=,db=,client=,type=postmaster LOG: License type is "Enterprise"
    ...
    server started
  3. Проверка:

    • содержимого таблицы cyber_test_tbl:

      $ psql -p 5401 -d cyber_test_db -c "SELECT * FROM cyber_test_tbl;"

      time | text
      ----------------------------+--------
      2024-11-06 08:08:28.995095 | test00
      2024-11-06 08:13:32.064309 | test01
      (2 rows)
    • контрольной суммы данных:

      $ psql -p 5401 -d cyber_test_db -c "SELECT md5(array_to_string(array_agg (cyber_test_tbl::text), ';')) FROM cyber_test_tbl;"

      md5
      ----------------------------------
      ebca67147d3d0a6e2500a55a4be19fdf
      (1 row)
  4. Сравнение чек-сумм до создания копии test01 и после восстановления:

    md5 hash
    До создания копииebca67147d3d0a6e2500a55a4be19fdf
    После восстановленияebca67147d3d0a6e2500a55a4be19fdf

    Совпадение чек-сумм подтверждает, что данные восстанавливаются корректно и полностью соответствуют состоянию на момент создания резервной копии.

Восстановление инкрементальной резервной копии test02
  1. Восстановление (в режиме «как файлы») инкрементальной резервной копии test02 во временный каталог на исходный сервер-клиент через web-консоль Кибер Бэкап.

  2. Запуск восстановленной резервной копии test02:

    $ pg_ctl -D /restore_dbms/test02 start

    waiting for server to start....2024-11-06 09:21:29 MSK [1700649]: [1-1] app=,user=,db=,client=,type=postmaster LOG: License type is "Enterprise"
    ...
    server started
  3. Проверка:

    • содержимого таблицы cyber_test_tbl:

      $ psql -p 5402 -d cyber_test_db -c "SELECT * FROM cyber_test_tbl;"

      time | text
      ----------------------------+--------
      2024-11-06 08:08:28.995095 | test00
      2024-11-06 08:13:32.064309 | test01
      2024-11-06 08:16:11.917502 | test02
      (3 rows)
    • контрольной суммы данных:

      $ psql -p 5402 -d cyber_test_db -c "SELECT md5(array_to_string(array_agg(cyber_test_tbl::text), ';')) FROM cyber_test_tbl;"

      md5
      ----------------------------------
      b80c6e2803f3a0f327e893f2c9ebdaef
      (1 row)
  4. Сравнение чек-сумм до создания копии test02 и после восстановления:

    md5 hash
    До создания копииb80c6e2803f3a0f327e893f2c9ebdaef
    После восстановленияb80c6e2803f3a0f327e893f2c9ebdaef

    Совпадение чек-сумм подтверждает, что данные восстанавливаются корректно и полностью соответствуют состоянию на момент создания резервной копии.

Резервное копирование с WAL-архивами

В СУБД Pangolin предусмотрена возможность использования расширения pgse_backup.

Для этого на сервере с установленной СУБД Pangolin должны быть доступны:

  • пакет pangolin-backup-tools;
  • расширение pgse_backup.
примечание

Применение pangolin-backup-tools не является обязательным, но оно обеспечивает более удобный контроль за процессом архивации WAL-файлов — через представление backup.wal_history можно отслеживать состояние копий файлов журнала транзакций.

Использование pangolin-backup-tools позволяет не хранить WAL-архивы локально, а после успешного завершения резервного копирования такие архивы автоматически удалять.

Создание копий архивов WAL-файлов можно выполнять отдельной файловой политикой Кибер Бэкап, или сразу архивировать WAL-файлы на сетевое хранилище напрямую подключенное к серверу с СУБД.

Ниже будет рассмотрен вариант создания файловой копии WAL-файлов отдельной политикой Кибер Бэкап совместно с использованием pangolin-backup-tools.

Создание полной копии и копии с WAL-архивами для возможности восстановления на точку во времени (PITR)

Подготовка
  1. Подготовка каталога для архивирования WAL-файлов через pg_probackup:

    $ pg_probackup init -B /pgarclogs/0{base_version}

    INFO: Backup catalog '/pgarclogs/0{base_version}' successfully inited

    $ pg_probackup add-instance -B /pgarclogs/0{base_version} -D $PGDATA --instance clustername

    INFO: Instance 'clustername' successfully inited
  2. Включение параметров archive_mode и archive_command в $PGDATA/postgresql.conf:

    archive_mode = 'on'
    archive_command = '/usr/pangolin-dbms-client-{product_version}/bin/pg_probackup archive-push -B /pgarclogs/0{base_version} --instance clustername --wal-file-path=%p --wal-file-name=%f --compress --overwrite -j 4 --batch-size=100'

    После включения параметра archive_mode WAL-файлы, которые заполнены и больше не требуются СУБД для текущей работы сервера, будут архивироваться и перекладываться в «Backup catalog» созданный через pg_probackup:

    INFO: pg_probackup archive-push WAL file: 000000010000000000000001, threads: 1/4, batch: 1/100, compression: zlib
    INFO: pg_probackup archive-push completed successfully, pushed: 1, skipped: 0, time elapsed: 125ms
  3. Добавление pre/post команд в план резервного копирования WAL-архивов для корректного заполнения представления backup.wal_history о статусе резервного копирования:

    Пример команд:

    # Pre cmd
    SESSIONID="$(acrocmd list activities --output=raw --limit=2 | grep "Backup plan" | grep -Eo '[0-9A-F]{8}-([0-9A-F]{4}-)[0-9A-F] {12}')" /opt/pangolin-backup-tools/bin/pangolin_archlogs.sh -o start

    # Post cmd
    SESSIONID="$(acrocmd list activities --output=raw --limit=2 | grep "Backup plan" | grep -Eo '[0-9A-F]{8}-([0-9A-F]{4}-){3}[0-9A-F] {12}')" SMEXIT=0 /opt/pangolin-backup-tools/bin/pangolin_archlogs.sh -o stop
    примечание

    Запуск post-команды pangolin_archlogs.sh -o stop удаляет локально хранящиеся на клиенте WAL-архивы после успешного завершения создания резервной копии Кибер Бэкап.

  4. Установка расширения pgse_backup:

    $ psql -c "CREATE extension pgse_backup;"

    CREATE EXTENSION
  5. Проверка доступности представления backup.wal_history:

    $ psql -c "SELECT * FROM backup.wal_history;"

    session_id | state | start_time | stop_time | duration | info
    ------------+-------+------------+-----------+----------+------
    (0 rows)
  6. Создание планов резервного копирования со стороны Кибер Бэкап:

    • для СУБД:

    • для WAL-архивов:

  7. Создание базы данных cyber_test_wal_db и таблицы cyber_test_wal_tbl:

    $ psql -c "CREATE DATABASE cyber_test_wal_db"

    CREATE DATABASE

    $ psql -d cyber_test_wal_db -c "CREATE TABLE cyber_test_wal_tbl (time timestamp default now(), text text);"

    CREATE TABLE
  8. Запуск плана полного резервного копирования СУБД:

Создание первой резервной копии WAL-архивов

  1. Создание записи wal-test00 в таблице:

    $ psql -d cyber_test_wal_db -c "INSERT INTO cyber_test_wal_tbl (text) VALUES ('wal-test00');"

    INSERT 0 1

    Успешный результат – запись создана:

    $ psql -d cyber_test_wal_db -c "SELECT * FROM cyber_test_wal_tbl;"

    time | text
    ----------------------------+------------
    2024-11-06 14:18:35.662661 | wal-test00
    (1 row)

    Снятие чек-суммы таблицы:

    $ psql -d cyber_test_wal_db -c "SELECT md5(array_to_string(array_agg(cyber_test_wal_tbl::text), ';')) FROM cyber_test_wal_tbl;"

    md5
    ----------------------------------
    e716f9ca4127dae0c1adb3283040512b
    (1 row)
  2. Эмуляция архивирования WAL-файлов:

    $ psql -c "SELECT pg_switch_wal();"

    pg_switch_wal
    ---------------
    0/3059CC2
    (1 row)
  3. Запуск плана резервного копирования WAL-архивов.

  4. Проверка статуса создания резервной копии WAL-архивов:

    • в web-консоли Кибер Бэкап:

    • через представление backup.wal_history:

      $ psql -c "SELECT * FROM backup.wal_history;"

      session_id | state | start_time | stop_time | duration | info
      -------------------------------------+-----------+------------------------+------------------------+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      D9BEA212-EF0D-4FA9-BB44-1B79F94EF9FE | completed | 2024-11-06 14:23:56+03 | 2024-11-06 14:24:05+03 | 00:00:09 | {"1": {"parent_tli": 0, "switchpoint": "0/0", "min_segno": "000000010000000000000003", "max_segno": "000000010000000000000003", "n_segments": 1, "size": 165122, "zratio": 101.6, "status": "ok", "lost_segments": []}}
      (1 row)

Создание второй резервной копии WAL-архивов

  1. Создание записи wal-test01 в таблице:

    $ psql -d cyber_test_wal_db -c "INSERT INTO cyber_test_wal_tbl (text) VALUES ('wal-test01');"

    INSERT 0 1

    Успешный результат – запись создана:

    $ psql -d cyber_test_wal_db -c "SELECT * FROM cyber_test_wal_tbl;"

    time | text
    ----------------------------+------------
    2024-11-06 14:18:35.662661 | wal-test00
    2024-11-06 14:29:37.044631 | wal-test01
    (2 rows)

    Снятие чек-суммы таблицы:

    $ psql -d cyber_test_wal_db -c "SELECT md5(array_to_string(array_agg(cyber_test_wal_tbl::text), ';')) FROM cyber_test_wal_tbl;"

    md5
    ----------------------------------
    4eabf25a7f941e667232997e7ebd74c1
    (1 row)
  2. Эмуляция архивирования WAL-файлов:

    $ psql -c "SELECT pg_switch_wal();"

    pg_switch_wal
    ---------------
    0/400014A
    (1 row)
  3. Запуск плана резервного копирования WAL-архивов.

  4. Проверка статуса создания резервной копии WAL-архивов:

    • в web-консоли Кибер Бэкап;

    • через представление backup.wal_history:

      $ psql -c "SELECT * FROM backup.wal_history;"

      session_id | state | start_time | stop_time | duration | info
      -------------------------------------+-----------+------------------------+------------------------+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      D9BEA212-EF0D-4FA9-BB44-1B79F94EF9FE | completed | 2024-11-06 14:23:56+03 | 2024-11-06 14:24:05+03 | 00:00:09 | {"1": {"parent_tli": 0, "switchpoint": "0/0", "min_segno": "000000010000000000000003", "max_segno": "000000010000000000000003", "n_segments": 1, "size": 165122, "zratio": 101.6, "status": "ok", "lost_segments": []}}
      B51186EE-5BA5-4984-BD8B-4DF6B3A79F91 | completed | 2024-11-06 14:31:21+03 | 2024-11-06 14:31:29+03 | 00:00:08 | {"1": {"parent_tli": 0, "switchpoint": "0/0", "min_segno": "000000010000000000000004", "max_segno": "000000010000000000000004", "n_segments": 1, "size": 73456, "zratio": 228.4, "status": "ok", "lost_segments": []}}
      (2 rows)

Создание третьей резервной копии WAL-архивов

  1. Создание записи wal-test02 в таблице:

    $ psql -d cyber_test_wal_db -c "INSERT INTO cyber_test_wal_tbl (text) VALUES ('wal-test02');"

    INSERT 0 1

    Успешный результат – запись создана:

    $ psql -d cyber_test_wal_db -c "SELECT * FROM cyber_test_wal_tbl;"

    time | text
    ----------------------------+------------
    2024-11-06 14:18:35.662661 | wal-test00
    2024-11-06 14:29:37.044631 | wal-test01
    2024-11-06 14:34:49.035367 | wal-test02
    (3 rows)

    Снятие чек-суммы таблицы:

    $ psql -d cyber_test_wal_db -c "SELECT md5(array_to_string(array_agg(cyber_test_wal_tbl::text), ';')) FROM cyber_test_wal_tbl;"

    md5
    ----------------------------------
    20e826c14e4db9c1c94db1f677dcd34d
    (1 row)
  2. Эмуляция архивирования WAL-файлов:

    $ psql -c "SELECT pg_switch_wal();"

    pg_switch_wal
    ---------------
    0/500014A
    (1 row)
  3. Запуск плана резервного копирования WAL-архивов.

  4. Проверка статуса создания резервной копии WAL-архивов:

    • в web-консоли Кибер Бэкап;

    • через представление backup.wal_history:

      $ psql -c "SELECT * FROM backup.wal_history;"

      session_id | state | start_time | stop_time | duration | info
      -------------------------------------+-----------+------------------------+------------------------+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      D9BEA212-EF0D-4FA9-BB44-1B79F94EF9FE | completed | 2024-11-06 14:23:56+03 | 2024-11-06 14:24:05+03 | 00:00:09 | {"1": {"parent_tli": 0, "switchpoint": "0/0", "min_segno": "000000010000000000000003", "max_segno": "000000010000000000000003", "n_segments": 1, "size": 165122, "zratio": 101.6, "status": "ok", "lost_segments": []}}
      B51186EE-5BA5-4984-BD8B-4DF6B3A79F91 | completed | 2024-11-06 14:31:21+03 | 2024-11-06 14:31:29+03 | 00:00:08 | {"1": {"parent_tli": 0, "switchpoint": "0/0", "min_segno": "000000010000000000000004", "max_segno": "000000010000000000000004", "n_segments": 1, "size": 73456, "zratio": 228.4, "status": "ok", "lost_segments": []}}
      2DB1D24D-85AE-4719-8993-802B68CF6606 | completed | 2024-11-06 14:37:05+03 | 2024-11-06 14:37:13+03 | 00:00:08 | {"1": {"parent_tli": 0, "switchpoint": "0/0", "min_segno": "000000010000000000000005", "max_segno": "000000010000000000000005", "n_segments": 1, "size": 73451, "zratio": 228.41, "status": "ok", "lost_segments": []}}
      (3 rows)

Восстановление из резервной копии через restore_command

Восстановление полной резервной копии пустой базы данных
  1. Восстановление (в режиме «как файлы») полной резервной копии wal-test00 во временный каталог на исходный сервер-клиент через web-консоль Кибер Бэкап:

  2. Восстановление (в режиме «как файлы») каждой копии WAL-архивов в один и тот же временный каталог на сервер-клиент через web-консоль Кибер Бэкап:

Восстановление базы данных на момент копии wal-test00
  1. Настройка restore_command в postgresql.conf для восстановленной полной копии wal-test00:

    restore_command = 'gunzip < /restore_dbms/wal-test/%f.gz > %p'
    recovery_target_time = '2024-11-6 14:19 Europe/Moscow'
  2. Запуск восстановления резервной копии до wal-test00:

    ### Включить режим 'recovery'
    $ touch full/recovery.signal

    $ pg_ctl -D /restore_dbms/full start

    waiting for server to start....2024-11-06 15:45:07 MSK [1706156]: [1-1] app=,user=,db=,client=, type=postmaster LOG: License type is "Enterprise"
    ...
    server started
  3. Проверка:

    • содержимого таблицы cyber_test_wal_db:

      $ psql -d cyber_test_wal_db -c "SELECT * FROM cyber_test_wal_tbl;"

      time | text
      ----------------------------+------------
      2024-11-06 14:18:35.662661 | wal-test00
      (1 row)
    • контрольной суммы данных:

      $ psql -d cyber_test_wal_db -c "SELECT md5(array_to_string(array_agg(cyber_test_wal_tbl::text), ';')) FROM cyber_test_wal_tbl;"

      md5
      ----------------------------------
      e716f9ca4127dae0c1adb3283040512b
      (1 row)
  4. Сравнение чек-сумм до создания копии wal-test00 и после восстановления:

    md5 hash
    До создания копииe716f9ca4127dae0c1adb3283040512b
    После восстановленияe716f9ca4127dae0c1adb3283040512b

    Совпадение чек-сумм подтверждает, что данные восстанавливаются корректно и полностью соответствуют состоянию на момент времени wal-test00.

Восстановление базы данных на момент копии wal-test01
  1. Настройка restore_command в postgresql.conf для восстановленной полной копии wal-test01:

    restore_command = 'gunzip < /restore_dbms/wal-test/%f.gz > %p'
    recovery_target_time = '2024-11-6 14:30 Europe/Moscow'
  2. Запуск восстановления резервной копии до wal-test01:

    ### Включить режим 'recovery'
    $ touch full/recovery.signal

    $ pg_ctl -D /restore_dbms/full start

    waiting for server to start....2024-11-06 15:49:07 MSK [1706189]: [1-1] app=,user=,db=,client=,type=postmaster LOG: License type is "Enterprise"
    ...
    server started
  3. Проверка:

    • содержимого таблицы cyber_test_wal_db:

      $ psql -d cyber_test_wal_db -c "SELECT * FROM cyber_test_wal_tbl;"

      time | text
      ----------------------------+------------
      2024-11-06 14:18:35.662661 | wal-test00
      2024-11-06 14:29:37.044631 | wal-test01
      (2 rows)
    • контрольной суммы данных:

      $ psql -d cyber_test_wal_db -c "SELECT md5(array_to_string(array_agg(cyber_test_wal_tbl::text), ';')) FROM cyber_test_wal_tbl;"

      md5
      ----------------------------------
      4eabf25a7f941e667232997e7ebd74c1
      (1 row)
  4. Сравнение чек-сумм до создания копии wal-test01 и после восстановления:

    md5 hash
    До создания копии4eabf25a7f941e667232997e7ebd74c1
    После восстановления4eabf25a7f941e667232997e7ebd74c1

    Совпадение чек-сумм подтверждает, что данные восстанавливаются корректно и полностью соответствуют состоянию на момент времени wal-test01.

Восстановление базы данных на момент копии wal-test02
  1. Настройка restore_command в postgresql.conf для восстановленной полной копии wal-test02:

    restore_command = 'gunzip < /restore_dbms/wal-test/%f.gz > %p'
    recovery_target_time = '2024-11-6 14:34 Europe/Moscow'
  2. Запуск восстановления резервной копии до wal-test02:

    ### Включить режим 'recovery'
    $ touch full/recovery.signal

    $ pg_ctl -D /restore_dbms/full start

    waiting for server to start....2024-11-06 15:51:46 MSK [1706223]: [1-1] app=,user=,db=,client=,type=postmaster LOG: License type is "Enterprise"
    ...
    server started
  3. Проверка:

    • содержимого таблицы cyber_test_wal_db:

      $ psql -d cyber_test_wal_db -c "SELECT * FROM cyber_test_wal_tbl;"

      time | text
      ----------------------------+------------
      2024-11-06 14:18:35.662661 | wal-test00
      2024-11-06 14:29:37.044631 | wal-test01
      2024-11-06 14:34:49.035367 | wal-test02
      (3 rows)
    • контрольной суммы данных:

      $ psql -d cyber_test_wal_db -c "SELECT md5(array_to_string(array_agg(cyber_test_wal_tbl::text), ';')) FROM cyber_test_wal_tbl;"

      md5
      ----------------------------------
      20e826c14e4db9c1c94db1f677dcd34d
      (1 row)
  4. Сравнение чек-сумм до создания копии wal-test02 и после восстановления:

    md5 hash
    До создания копии20e826c14e4db9c1c94db1f677dcd34d
    После восстановления20e826c14e4db9c1c94db1f677dcd34d

    Совпадение чек-сумм подтверждает, что данные восстанавливаются корректно и полностью соответствуют состоянию на момент времени wal-test02.