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/wal

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

WAL: принцип write-ahead и LSN

WAL - последовательный журнал изменений. Правило write-ahead: запись об изменении попадает на диск раньше самой страницы данных, поэтому сбой не теряет подтверждённые данные. LSN - смещение в потоке журнала. COMMIT при synchronous_commit=on ждёт сброса журнала на диск.

view as markdownaka: write-ahead-log, wal-lsn, synchronous-commit

Правило write-ahead

Любое изменение делается в два приёма: сначала запись об изменении дописывается в журнал и попадает на диск, и только потом (позже) изменённая страница данных. Журнал опережает данные - отсюда «запись с опережением».

Это спасает при сбое: если упали после журнальной записи, но до записи страницы - изменение доиграют из журнала; если до журнальной записи - транзакция не подтверждена, терять нечего.

Почему дёшево

Журнал пишется последовательно, дозаписью в конец одного потока. Последовательная запись на порядки быстрее случайной записи разбросанных по диску страниц. WAL превращает множество мелких случайных записей в одну последовательную, а запись страниц данных откладывает (bgwriter, контрольная точка - см. checkpoint).

LSN

LSN (Log Sequence Number) - смещение в байтах в потоке WAL, тип pg_lsn, печатается как 16/B374D848. Каждая страница помнит LSN последнего отражённого в ней изменения (pd_lsn); страницу нельзя записать на диск, пока журнал не сброшен до её pd_lsn. Разница двух LSN - объём журнала в байтах.

sql
SELECT pg_current_wal_lsn();
SELECT pg_current_wal_lsn() - '0/0';   -- сколько байт WAL сгенерировано

Durability и synchronous_commit

COMMIT дописывает запись о коммите и ждёт сброса журнала на диск (fsync) до неё - это буква D в ACID. synchronous_commit = on (по умолчанию) включает это ожидание; off ускоряет коммит ценой потери хвоста подтверждённых транзакций при сбое (данные остаются согласованными).

Что пишут и где

Журнал живёт в сегментах pg_wal/ (16 МБ). Пишут бэкенды и walwriter. Темп виден в pg_stat_wal. Защита от рваной записи - full-page-images; уровень детализации - wal-level.

§ команды

bash
SELECT pg_current_wal_lsn();

Текущая позиция записи в журнал

bash
SELECT wal_records, wal_bytes, wal_fpi FROM pg_stat_wal;

Темп и состав генерации WAL

bash
SHOW synchronous_commit;

Ждёт ли COMMIT сброса журнала на диск

§ см. также

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