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/kb/Буферный кеш и WAL/checkpoint

kb/buffers-wal ── Буферный кеш и WAL ── intermediate

Контрольные точки и восстановление

Контрольная точка сбрасывает все грязные буферы на диск и фиксирует redo point - позицию журнала, с которой начнётся восстановление. Crash recovery проигрывает WAL от redo point вперёд; незакоммиченные транзакции откатываются через clog. Запускается по checkpoint_timeout / max_wal_size.

view as markdownaka: checkpoint-recovery, redo-point, crash-recovery

Зачем нужна

Журнал растёт бесконечно, а без границы восстановление пришлось бы начинать с начала времён. Контрольная точка сбрасывает на диск все грязные буферы, накопленные к моменту, и записывает в pg_control redo point - позицию журнала, до которой все изменения уже в файлах данных. Дальше этой точки откатываться при восстановлении не нужно.

Redo point - на начало, не на конец

Сброс буферов не мгновенен (минуты), и база тем временем пишет новый журнал. Поэтому redo point берётся на момент начала контрольной точки: всё, что было грязным к её началу, она гарантированно запишет, и восстановление с этой позиции увидит в журнале всё ещё не попавшее на диск.

Crash recovery

При старте после некорректной остановки PostgreSQL:

  1. читает redo point из pg_control;
  2. проигрывает WAL от redo point вперёд, применяя записи к страницам;
  3. full-page images чинят рваные страницы (см. full-page-images);
  4. доходит до обрыва CRC - конец журнала;
  5. незакоммиченные транзакции невидимы через clog (фактически откачены).

Redo накатывает и незакоммиченные изменения физически, но их статус в clog не «committed», поэтому MVCC их не показывает.

Когда запускается

  • по таймеру checkpoint_timeout (5 мин по умолчанию);
  • по объёму журнала max_wal_size (1 ГБ);
  • вручную CHECKPOINT или перед остановкой сервера.

checkpoint_completion_target (0.9) размазывает запись грязных буферов во времени, сглаживая всплеск нагрузки на диск.

Наблюдать (PG17)

sql
SELECT num_timed, num_requested, buffers_written
FROM pg_stat_checkpointer;

Здоровый признак - num_timed заметно больше num_requested. Перекос в сторону num_requested означает переполнение журнала по max_wal_size - сигнал поднять его. Сам журнал - в wal.

§ команды

bash
CHECKPOINT;

Принудительная контрольная точка (тороплива — даёт всплеск записи)

bash
SELECT num_timed, num_requested FROM pg_stat_checkpointer;

Контрольные точки по таймеру против по объёму журнала (PG17)

bash
SHOW max_wal_size;

Порог журнала, при котором инициируется контрольная точка

§ см. также

  • walWAL: принцип write-ahead и LSNWAL - последовательный журнал изменений. Правило write-ahead: запись об изменении попадает на диск раньше самой страницы данных, поэтому сбой не теряет подтверждённые данные. LSN - смещение в потоке журнала. COMMIT при synchronous_commit=on ждёт сброса журнала на диск.
  • full-page-imagesFull-page images и CRCПри первом изменении страницы после контрольной точки PostgreSQL пишет в журнал не дельту, а всю страницу целиком (FPI) - чтобы при восстановлении починить «рваную» страницу после сбоя. Каждая WAL-запись защищена CRC; битая запись считается концом журнала.
  • wal-levelУровни журнала: minimal, replica, logicalwal_level задаёт детальность журнала: minimal (только crash recovery), replica (по умолчанию: репликация, архивация, PITR), logical (плюс логическое декодирование). Уровни вложены, смена требует перезапуска. Заглянуть в WAL можно через pg_walinspect и pg_waldump.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки