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