Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.

Восстановление PostgreSQL на момент времени (PITR): pg_waldump и recovery.signal

Обновлено: 26.08.2026  ·  Официальная база знаний
  • Случайное выполнение деструктивного запроса (DROP TABLE или ошибочный UPDATE без WHERE) в продакшн-базе.
  • Необходимость откатить состояние СУБД на секунду до момента совершения логической ошибки.
  • Ошибки согласованности при запуске инстанса в режиме восстановления архивов.

1. Поиск точного LSN или временной метки ошибки через pg_waldump

# Поиск деструктивной транзакции DROP TABLE в архивах WAL
pg_waldump /var/lib/postgresql/wal_archive/00000001000000A1000000B2 | grep -E "DROP|COMMIT"

2. Остановка текущего экземпляра и разворачивание базового бэкапа

systemctl stop postgresql

# Очистка текущего каталога данных (или перенос в backup_old)
rm -rf /var/lib/postgresql/16/main/*

# Разворачивание физического базового бэкапа (basebackup)
tar -xvf /mnt/backups/base_backup_2024_01_01.tar -C /var/lib/postgresql/16/main/

3. Конфигурация параметров восстановления в postgresql.conf

Создайте маркерный файл recovery.signal в каталоге данных:

touch /var/lib/postgresql/16/main/recovery.signal
chown postgres:postgres /var/lib/postgresql/16/main/recovery.signal

В конец файла /var/lib/postgresql/16/main/postgresql.conf добавьте параметры таргетинга:

# Команда для извлечения недостающих WAL-файлов из архива
restore_command = 'cp /var/lib/postgresql/wal_archive/%f %p'

# Целевая точка восстановления по времени (UTC или локальное время)
recovery_target_time = '2024-03-30 14:25:30'

# Действие по достижении точки: pause (для проверки) или promote
recovery_target_action = 'pause'
recovery_target_inclusive = false

4. Запуск инстанса, проверка данных и финализация

systemctl start postgresql

-- Проверка состояния: находится ли сервер в режиме восстановления
SELECT pg_is_in_recovery();

-- Если данные корректны, завершить восстановление и открыть базу на запись
SELECT pg_wal_replay_resume();
Практический опыт инженера: Всегда указывайте recovery_target_inclusive = false при откате последствий DROP TABLE, иначе сама транзакция удаления таблицы попадет в число накатанных операций и таблица все равно будет уничтожена.

Частые вопросы (FAQ)

Что произойдет с recovery.signal после успешного завершения PITR?

После завершения наката и перехода базы в обычный режим работы PostgreSQL автоматически удаляет файл recovery.signal или переименовывает его.

В чем разница между recovery_target_time и recovery_target_xid?

recovery_target_time указывает точную временную метку (timestamp), а recovery_target_xid — номер конкретной транзакции (Transaction ID), перед которой необходимо остановить накат.

Что делает параметр recovery_target_action = 'pause'?

Он приостанавливает накат WAL в заданной точке, переводя базу в режим Read-Only, чтобы администратор мог подключиться через psql, проверить данные и выполнить pg_wal_replay_resume().

Почему при PITR изменяется идентификатор Timeline (новая ветка таймлайна)?

При выходе из восстановления база открывает новую ветку истории (Timeline ID увеличивается на 1), чтобы новые транзакции не перезаписали оригинальную историю старых WAL.