Восстановление базы данных PostgreSQL

Восстановление базы данных PostgreSQL состоит из следующих этапов:

Проверка соединения утилиты wal-g

Чтобы проверить соединение:

  1. Установите переменные подключения к S3-совместимому хранилищу, если они не были заданы на этапе настройки Backup Wrapper. Для этого выполните команды:

    export WALG_S3_PREFIX="<walg_s3_prefix>"
    export AWS_ACCESS_KEY_ID="<aws_access_key>"
    export AWS_SECRET_ACCESS_KEY="<aws_secret_key>"
    export AWS_ENDPOINT="<aws_endpoint>"
    export AWS_S3_FORCE_PATH_STYLE=true
    export AWS_REGION="<aws_region>"

    Здесь:

    • <walg_s3_prefix> — путь к хранилищу, в котором будут храниться резервные копии, например, s3://backups/postgresql/wal.

    • <aws_access_key> — идентификатор ключа доступа к S3-совместимому хранилищу.

    • <aws_secret_key> — секретный ключ доступа к S3-совместимому хранилищу.

    • <aws_endpoint> — URL-адрес S3-совместимого хранилища, например, http://minio:9000

    • <aws_region> — код региона, в котором развернуты и выполняются ваши сервисы и функции AWS, например, ru-central1-a.

  2. Проверьте доступ утилиты wal-g к S3-совместимому хранилищу, выполнив команду:

    wal-g backup-list

Восстановление базы данных

Возможные сценарии восстановления базы данных PostgreSQL:

Полное восстановление из последней резервной копии

Чтобы восстановить базу данных:

  1. Остановите сервис PostgreSQL, выполнив команду:

    systemctl stop postgresql
  2. Очистите директорию с данными PostgreSQL (PGDATA), выполнив команду:

    rm -rf /<path_to_pgdata>/*
    После очистки все текущие данные в PostgreSQL будут утеряны. Предварительно проверьте восстановление из выбранной резервной копии в тестовой среде. Это снизит риск полной потери данных.

    Здесь:

    • <path_to_pgdata> — путь к директории с данными PostgreSQL, например, /var/lib/pgsql/16/data.

  3. Восстановите базу данных из последней резервной копии, выполнив команду:

    wal-g backup-fetch /<path_to_pgdata> LATEST

    Здесь:

    • <path_to_pgdata> — путь к директории с данными PostgreSQL, например, /var/lib/pgsql/16/data.

  4. Создайте файл recovery.signal для применения WAL-архивации, выполнив команду:

    touch /<path_to_pgdata>/recovery.signal

    Здесь:

    • <path_to_pgdata> — путь к директории с данными PostgreSQL, например, /var/lib/pgsql/16/data.

  5. Настройте параметр restore_command в файле конфигурации postgresql.conf, выполнив команду:

    echo "restore_command = 'wal-g wal-fetch %f %p'" >> /<path_to_pgdata>/postgresql.conf

    Здесь:

    • <path_to_pgdata> — путь к директории с данными PostgreSQL, например, /var/lib/pgsql/16/data.

  6. Запустите сервис PostgreSQL, выполнив команду:

    systemctl start postgresql
  7. Дождитесь окончания процесса восстановления. Для отслеживания логов восстановления в командной строке можно выполнить команду:

    tail -f /var/log/postgresql/postgresql-*.log | grep -i recovery

    Дождитесь появления записи:

    database system is ready to accept connections

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

Чтобы восстановить базу данных:

  1. Остановите сервис PostgreSQL, выполнив команду:

    systemctl stop postgresql
  2. Очистите директорию с данными PostgreSQL (PGDATA), выполнив команду:

    rm -rf /<path_to_pgdata>/*
    После очистки все текущие данные в PostgreSQL будут утеряны. Предварительно проверьте восстановление из выбранной резервной копии в тестовой среде. Это снизит риск полной потери данных.

    Здесь:

    • <path_to_pgdata> — путь к директории с данными PostgreSQL, например, /var/lib/pgsql/16/data.

  3. Посмотрите список резервных копий, выполнив команду:

    wal-g backup-list
    Пример вывода
    name                          last_modified        wal_segment_backup_start
    base_000000010000000000000005 2026-01-27T10:00:00Z 000000010000000000000005
    base_000000010000000000000010 2026-01-28T10:00:00Z 000000010000000000000010
  4. Восстановите базу данных из нужной резервной копии, выполнив команду:

    wal-g backup-fetch /<path_to_pgdata> <backup_name>

    Здесь:

    • <path_to_pgdata> — путь к директории с данными PostgreSQL, например, /var/lib/pgsql/16/data.

    • <backup_name> — название резервной копии, например, base_000000010000000000000010.

  5. Настройте параметр restore_command в файле конфигурации postgresql.conf, выполнив команду:

    echo "restore_command = 'wal-g wal-fetch %f %p'" >> /<path_to_pgdata>/postgresql.conf

    Здесь:

    • <path_to_pgdata> — путь к директории с данными PostgreSQL, например, /var/lib/pgsql/16/data.

  6. Запустите сервис PostgreSQL, выполнив команду:

    systemctl start postgresql
  7. Дождитесь окончания процесса восстановления. Для отслеживания логов восстановления в командной строке можно выполнить команду:

    tail -f /var/log/postgresql/postgresql-*.log | grep -i recovery

    Дождитесь появления записи:

    database system is ready to accept connections

Откат базы данных на определенный момент времени (PITR)

Чтобы восстановить базу данных:

  1. Остановите сервис PostgreSQL, выполнив команду:

    systemctl stop postgresql
  2. Очистите директорию с данными PostgreSQL (PGDATA), выполнив команду:

    rm -rf /<path_to_pgdata>/*
    После очистки все текущие данные в PostgreSQL будут утеряны. Предварительно проверьте восстановление из выбранной резервной копии в тестовой среде. Это снизит риск полной потери данных.

    Здесь:

    • <path_to_pgdata> — путь к директории с данными PostgreSQL, например, /var/lib/pgsql/16/data.

  3. Восстановите базу данных из резервной копии, которая была создана до нужного момента времени. Для этого выполните команду:

    wal-g backup-fetch /<path_to_pgdata> <backup_name>

    Здесь:

    • <path_to_pgdata> — путь к директории с данными PostgreSQL, например, /var/lib/pgsql/16/data.

    • <backup_name> — название резервной копии, например, base_000000010000000000000010.

  4. Настройте PITR в файле конфигурации postgresql.conf, выполнив команду:

    cat >> /<path_to_pgdata>/postgresql.conf << 'EOF' restore_command = 'wal-g wal-fetch %f %p' recovery_target_time = '<target_time>' recovery_target_action = 'promote' EOF

    Здесь:

    • <path_to_pgdata> — путь к директории с данными PostgreSQL, например, /var/lib/pgsql/16/data.

    • <target_time> — дата и время, до которых необходимо откатить базу данных, например, 2026-01-28 10:00:00.

  5. Создайте файл recovery.signal для применения WAL-архивации, выполнив команду:

    touch /<path_to_pgdata>/recovery.signal

    Здесь:

    • <path_to_pgdata> — путь к директории с данными PostgreSQL, например, /var/lib/pgsql/16/data.

  6. Запустите сервис PostgreSQL, выполнив команду:

    systemctl start postgresql
  7. Дождитесь окончания процесса восстановления. Для отслеживания логов восстановления в командной строке можно выполнить команду:

    tail -f /var/log/postgresql/postgresql-*.log | grep -i recovery

    Дождитесь появления записи:

    database system is ready to accept connections

Проверка после восстановления

Чтобы проверить, что восстановление базы данных прошло корректно:

  1. Проверьте логи на наличие ошибок. Для вывода логов с ошибками выполните команду:

    grep -i error /var/log/postgresql/postgresql-*.log
  2. Проверьте статус репликации при наличии реплик баз данных. Для этого выполните команду:

    psql -c "SELECT * FROM pg_stat_replication;"
  3. Проверьте целостность данных, выполнив команду:

    psql -c "SELECT count(*) FROM <table_name>;"

    Здесь:

    • <table_name> — название таблицы базы данных.

  4. Проверьте, что параметр резервного копирования archive_command включен для будущих восстановлений, с помощью команды:

    psql -c "SHOW archive_mode; SHOW archive_command;"

Была ли полезна эта страница?

Обратная связь