EMZETT.
Войти

Point-in-time recovery: возврат базы данных на определённый момент

Коротко: Point-in-time recovery (PITR) восстанавливает базу данных на любой момент в прошлом, воспроизводя журнал транзакций поверх базовой резервной копии до этого момента.

Подробнее: Ночная резервная копия мало помогает, если в 14:03 случайно удалена таблица: не хватает половины дня. PITR закрывает этот пробел, храня в дополнение к резервной копии каждое отдельное изменение.

Подробности

Принцип

Базы данных записывают каждое изменение сначала в журнал упреждающей записи (WAL). При PITR есть базовая резервная копия (полная копия данных) плюс непрерывно архивируемый WAL. Чтобы восстановить, вы возвращаете базовую копию и позволяете WAL проигрываться до момента непосредственно перед ошибкой (recovery_target_time). Результат: состояние на 14:02:59 вместо вчерашней ночи.

Реализация (PostgreSQL)

  • archive_mode = on и archive_command копируют готовые сегменты WAL в надёжное место.
  • Базовая копия через pg_basebackup (или инструменты вроде pgBackRest, Barman, WAL-G).
  • Восстановление: поместить копию на место, создать recovery.signal, задать целевое время, запустить сервер.
  • Управляемые сервисы (например, Neon, Supabase, RDS) предлагают PITR как функцию, часто с ограниченным окном (от часов до дней в зависимости от плана).

Важные замечания

  • PITR защищает от ошибок оператора и неисправных обновлений, но не от отказа хранилища, если архив WAL лежит в том же месте: храните его вне площадки.
  • Проверяйте восстановление; непроверенная резервная копия — лишь надежда.
  • Обычно восстанавливают в новый экземпляр и забирают только нужные данные.
  • Срок хранения должен соответствовать обязанностям хранения и защите данных (удалённые персональные данные исчезают из резервных копий лишь по истечении срока).
  • Ключевые показатели: RPO (какая потеря данных допустима) и RTO (сколько может занять восстановление).

См. также: pg_dump и psql, Транзакции и ACID, Neon