0Pricing
SQL Academy · Урок

Восстановление на момент времени

Восстанавливайте состояние на любой момент с помощью 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 — способ получения архивированных сегментов WAL
  • recovery_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 — номер последовательности журнала WAL
  • recovery_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;

Выполнение восстановления

Восстановление состоит из трёх шагов:

  1. Остановите работающий экземпляр PostgreSQL.
  2. Восстановите базовую резервную копию в каталоге данных.
  3. Настройте параметры восстановления и запустите 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 — локальная установка не требуется.

Все уроки этого курса

  1. Логические и физические резервные копии
  2. Восстановление на момент времени
  3. Проверка восстановления
  4. Планирование аварийного восстановления
← Назад к SQL Academy