linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/lessons/pg-lab-42-1-pitr

lesson ── postgres-labs ── ~20 мин ── 4 шагов

Архив WAL и привязка момента к сегменту

Полное восстановление на точку требует отдельной топологии с перезапуском сервера. Здесь ты разберёшь то, что доступно на одном работающем сервере: привяжешь текущий момент к сегменту WAL и на своей шкуре увидишь главную ловушку PITR - archive_mode применяется только при рестарте. Сначала предсказывай, потом проверяй.

▶ интерактивный sandbox

Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.

запустить sandbox →

stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя

Шаги

  1. 01

    Проверь стартовое состояние архива

    Посмотри, включён ли архив WAL и какой уровень журнала:

    sql
    SELECT name, setting FROM pg_settings
    WHERE name IN ('archive_mode', 'wal_level');

    Предскажи: на учебном сервере archive_mode, скорее всего, off.

    ✓ Состояние архива прочитано.

  2. 02

    Привяжи текущий момент к сегменту WAL

    Каждая позиция LSN лежит в конкретном файле-сегменте журнала. Узнай имя текущего сегмента:

    sql
    SELECT pg_current_wal_lsn(), pg_walfile_name(pg_current_wal_lsn());

    Предскажи формат имени сегмента: это 24 шестнадцатеричных символа, вида 000000010000000000000003. Именно такой файл ушёл бы в архив.

    ✓ Момент привязан к сегменту - так PITR находит нужный WAL в архиве.

  3. 03

    Включи архив и проверь, применился ли он

    Попробуй включить архив на лету и перечитать конфиг:

    sql
    ALTER SYSTEM SET archive_mode = on;
    SELECT pg_reload_conf();

    Предскажи: применится ли archive_mode сразу после reload, или pending_restart скажет, что он ждёт рестарта?

    sql
    SELECT name, setting, pending_restart FROM pg_settings WHERE name='archive_mode';
    подсказка

    archive_mode - параметр уровня сервера (context = postmaster), он не подхватывается по reload.

    ✓ pending_restart = t: настройка записана, но ждёт рестарта. До него архив не работает.

  4. 04

    Верни как было и заметь, что флаг не гаснет

    Сбрось изменение и перечитай конфиг:

    sql
    ALTER SYSTEM RESET archive_mode;
    SELECT pg_reload_conf();

    Предскажи: исчезнет ли pending_restart? Проверь оба сигнала:

    sql
    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());имя текущего сегмента WAL
  • ALTER SYSTEM SET archive_mode = on;включить архив (вступит в силу после рестарта)
  • SELECT name, pending_restart FROM pg_settings WHERE name='archive_mode';ждёт ли настройка рестарта

концепции

  • · PITR = базовая копия (pg_basebackup) + непрерывный архив WAL
  • · archive_mode применяется только при рестарте, а не по reload
  • · архив включают заранее: пока он off, WAL за это время не сохраняется

← предыдущая

work_mem и проливы сортировки на диск

следующая →

Ловушки SQL: воспроизведи и перепиши

Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки