Восстановление на момент времени
Восстанавливайте состояние на любой момент с помощью WAL
«Восстановление на момент времени» — бесплатный урок SQL Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Что такое восстановление на момент времени
Восстановление на момент времени (PITR) позволяет восстановить базу данных до любого конкретного момента в прошлом, а не только до времени создания последнего снимка резервной копии.
Это возможно потому, что PostgreSQL непрерывно записывает каждое изменение в поток, называемый журналом опережающей записи (WAL). Воспроизводя записи WAL поверх базовой резервной копии, Вы можете точно попасть в нужный момент.
Журнал опережающей записи (WAL)
Каждый оператор INSERT, UPDATE, DELETE и DDL сначала записывается в WAL, прежде чем изменить фактические файлы данных. Это гарантирует сохранность данных, даже если сервер выйдет из строя в середине записи.
Для PITR архивированные сегменты WAL служат лентами машины времени. Базовая резервная копия — это начальная точка, а WAL восполняет всё, что произошло после неё.
-- Check current WAL write location
SELECT pg_current_wal_lsn() AS current_lsn,
pg_walfile_name(pg_current_wal_lsn()) AS current_wal_file;Включение архивирования WAL
Прежде чем станет возможным PITR, архивирование WAL необходимо включить в postgresql.conf. Ключевые параметры — wal_level, archive_mode и archive_command.
Команда архивирования копирует каждый завершённый сегмент WAL в безопасное место, например в локальный каталог, подключённое хранилище NFS или облачное хранилище.
-- View current WAL and archive settings
SELECT name, setting, unit
FROM pg_settings
WHERE name IN (
'wal_level',
'archive_mode',
'archive_command',
'archive_status'
)
ORDER BY name;Создание базовой резервной копии
Базовая резервная копия — это согласованная копия всего каталога данных, создаваемая во время работы сервера. PostgreSQL предоставляет утилиту pg_basebackup и низкоуровневые функции SQL для координации этого процесса.
Базовая резервная копия вместе с архивированными сегментами WAL, записанными начиная с момента начала её создания, — это всё, что необходимо для PITR.
-- Check the latest base backup information
SELECT backup_start,
backup_end,
pg_size_pretty(backup_total) AS total_size
FROM pg_stat_basebackup;Определение времени цели восстановления
Когда происходит авария, первым шагом является определение точной временной отметки, до которой Вы хотите восстановить систему. Распространённый подход — найти временную отметку непосредственно перед вредоносным событием, например случайным массовым DELETE.
Эту временную отметку часто можно найти в таблицах журнала транзакций или журналах приложения. Сам WAL записывает временные отметки фиксации транзакций, если включён параметр track_commit_timestamp.
-- Find the commit timestamp of recent transactions (requires track_commit_timestamp=on)
SELECT xid,
pg_xact_commit_timestamp(xid::xid) AS committed_at
FROM pg_stat_activity
WHERE state = 'idle'
LIMIT 10;Параметры recovery.conf для восстановления
Поведение при восстановлении управляется параметрами, размещёнными в postgresql.conf (PostgreSQL 12+) или в старом файле recovery.conf. Наиболее важные из них:
restore_command— способ получения архивированных сегментов WALrecovery_target_time— точная временная отметка, на которой нужно остановитьсяrecovery_target_action— действие при достижении цели (promote,pause,shutdown)
-- Inspect recovery settings that are currently active
SELECT name, setting
FROM pg_settings
WHERE name IN (
'restore_command',
'recovery_target_time',
'recovery_target_action',
'recovery_target_inclusive'
)
ORDER BY name;Другие типы целевых точек восстановления
Время — не единственный способ задать целевую точку восстановления. PostgreSQL поддерживает четыре типа целей:
recovery_target_time— строка с отметкой времениrecovery_target_xid— идентификатор конкретной транзакции (ID)recovery_target_lsn— номер последовательности журнала WALrecovery_target_name— именованная точка восстановления, созданная с помощьюpg_create_restore_point()
-- Create a named restore point before a risky migration
SELECT pg_create_restore_point('before_migration_2024_07_01') AS restore_lsn;Имитация аварии
Чтобы попрактиковаться в PITR в тестовой среде, намеренно повредите или удалите данные, предварительно зафиксировав текущее время. Это позволяет убедиться, что восстановление выполняется на нужный момент и удалённые строки возвращаются.
-- Record the 'safe' timestamp, then simulate an accident
SELECT now() AS safe_point;
-- (In a test DB only!) accidentally delete important rows
DELETE FROM orders WHERE created_at < '2024-01-01';
-- Confirm the damage
SELECT COUNT(*) AS remaining_orders FROM orders;Выполнение восстановления
Восстановление состоит из трёх шагов:
- Остановите работающий экземпляр PostgreSQL.
- Восстановите базовую резервную копию в каталоге данных.
- Настройте параметры восстановления и запустите PostgreSQL в режиме восстановления — он воспроизводит WAL, пока не достигнет целевого времени, а затем переводится в обычный сервер чтения и записи.
В журналах сервера отображается применение каждого файла WAL, поэтому отслеживать ход выполнения легко.
-- After recovery completes, confirm the cluster is no longer in recovery
SELECT pg_is_in_recovery() AS in_recovery,
pg_last_xact_replay_timestamp() AS last_replayed_txn;Проверка восстановления
После перевода сервера в обычный режим убедитесь, что данные находятся в ожидаемом состоянии. Проверьте количество строк, временные метки самых новых строк и любые критически важные для бизнеса значения.
Разумно выполнить эти запросы проверки до того, как снова разрешить трафик приложения, чтобы при необходимости продолжить восстановление или изменить целевое время.
-- Verify row counts and the latest transaction timestamp after recovery
SELECT 'orders' AS tbl, COUNT(*) AS rows FROM orders
UNION ALL
SELECT 'order_items' AS tbl, COUNT(*) AS rows FROM order_items
UNION ALL
SELECT 'customers' AS tbl, COUNT(*) AS rows FROM customers
ORDER BY tbl;Рекомендации по PITR
Надёжная настройка PITR требует не только включения архивирования. Ключевые рекомендации включают:
- Регулярно проверяйте восстановление — непроверенная резервная копия не является резервной копией.
- Контролируйте отставание архива WAL — пропуски в архиве WAL делают полное восстановление невозможным.
- Храните историю WAL достаточной длины — сохраняйте сегменты как минимум начиная с самой старой действительной базовой резервной копии.
- Используйте отдельное место хранения — если основной диск выйдет из строя, заархивированный WAL на том же диске также будет потерян.
-- Check for any WAL archiving failures
SELECT archived_count,
failed_count,
last_archived_wal,
last_archived_time,
last_failed_wal,
last_failed_time
FROM pg_stat_archiver;Быстрая проверка
Проверьте, насколько вы поняли восстановление на момент времени.
Итоги: восстановление на момент времени
В этом уроке вы узнали, как WAL, то есть журнал упреждающей записи PostgreSQL, позволяет выполнять восстановление на любой момент в прошлом:
- Архивирование WAL сохраняет каждое изменение после создания базовой резервной копии.
- Целевые точки восстановления могут быть представлены отметкой времени, ID транзакции, LSN или именованной точкой восстановления.
- Процесс восстановления восстанавливает базовую резервную копию, воспроизводит заархивированный WAL и переводит сервер в обычный режим по достижении цели.
- Проверка подтверждает целостность данных до возобновления трафика.
- Рекомендации включают регулярные проверки восстановления, контроль архива и хранение WAL в другом месте.
PITR — ваша страховочная сетка от человеческих ошибок и повреждения данных. Освойте PITR — и вы освоите аварийное восстановление.
Часто задаваемые вопросы
Урок «Восстановление на момент времени» бесплатный?
Да — полный текст урока «Восстановление на момент времени» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Восстановление на момент времени»?
Восстанавливайте состояние на любой момент с помощью WAL Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Восстановление на момент времени»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Логические и физические резервные копии
- Восстановление на момент времени
- Проверка восстановления
- Планирование аварийного восстановления