lesson ── postgres-labs ── ~20 мин ── 4 шагов
Полное восстановление на точку требует отдельной топологии с перезапуском сервера. Здесь ты разберёшь то, что доступно на одном работающем сервере: привяжешь текущий момент к сегменту WAL и на своей шкуре увидишь главную ловушку PITR - archive_mode применяется только при рестарте. Сначала предсказывай, потом проверяй.
интерактивный sandbox
Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.
stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя
Посмотри, включён ли архив WAL и какой уровень журнала:
SELECT name, setting FROM pg_settings
WHERE name IN ('archive_mode', 'wal_level');Предскажи: на учебном сервере archive_mode, скорее всего, off.
✓ Состояние архива прочитано.
Каждая позиция LSN лежит в конкретном файле-сегменте журнала. Узнай имя текущего сегмента:
SELECT pg_current_wal_lsn(), pg_walfile_name(pg_current_wal_lsn());
Предскажи формат имени сегмента: это 24 шестнадцатеричных символа,
вида 000000010000000000000003. Именно такой файл ушёл бы в архив.
✓ Момент привязан к сегменту - так PITR находит нужный WAL в архиве.
Попробуй включить архив на лету и перечитать конфиг:
ALTER SYSTEM SET archive_mode = on;
SELECT pg_reload_conf();
Предскажи: применится ли archive_mode сразу после reload, или pending_restart скажет, что он ждёт рестарта?
SELECT name, setting, pending_restart FROM pg_settings WHERE name='archive_mode';
archive_mode - параметр уровня сервера (context = postmaster), он не подхватывается по reload.
✓ pending_restart = t: настройка записана, но ждёт рестарта. До него архив не работает.
Сбрось изменение и перечитай конфиг:
ALTER SYSTEM RESET archive_mode;
SELECT pg_reload_conf();
Предскажи: исчезнет ли pending_restart? Проверь оба сигнала:
SELECT pending_restart FROM pg_settings WHERE name='archive_mode';
SELECT count(*) FROM pg_file_settings WHERE name='archive_mode';
Здесь и прячется суть ловушки: pending_restart остаётся true до настоящего рестарта - reload его не гасит. А вот pg_file_settings сразу показывает 0: переопределение из конфига убрано. То есть «вернуть как было» через reload не отменяет того, что archive_mode менялся, - этот параметр действительно живёт только рестартом.
pg_file_settings показывает строки из конфиг-файлов; после RESET строки archive_mode там нет.
✓ Переопределение убрано (pg_file_settings = 0), но pending_restart висит до рестарта - вот почему archive_mode включают заранее.
PITR строится из базовой копии плюс непрерывного архива WAL. LSN и имя сегмента привязывают момент к журналу. Ловушка: archive_mode - параметр уровня сервера, применяется только при рестарте (pending_restart).
команды
SELECT pg_walfile_name(pg_current_wal_lsn());имя текущего сегмента WALALTER SYSTEM SET archive_mode = on;включить архив (вступит в силу после рестарта)SELECT name, pending_restart FROM pg_settings WHERE name='archive_mode';ждёт ли настройка рестартаконцепции