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/full-page-images

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

Full-page images и CRC

При первом изменении страницы после контрольной точки PostgreSQL пишет в журнал не дельту, а всю страницу целиком (FPI) - чтобы при восстановлении починить «рваную» страницу после сбоя. Каждая WAL-запись защищена CRC; битая запись считается концом журнала.

view as markdownaka: fpi, full-page-writes, torn-page

Проблема рваной записи

Страница PostgreSQL - 8 КБ, а диск или ОС пишут блоками поменьше (например, 4 КБ). Если сбой случится прямо во время записи 8-КБ страницы, на диск попадёт её половина: часть новая, часть старая. Это рваная запись (torn page). Обычная WAL-запись («измени байт X на Y») такую страницу не починит - она опирается на то, что страница целая.

Решение: full-page image

При первом изменении страницы после каждой контрольной точки PostgreSQL пишет в журнал полную копию страницы (FPI), а не дельту. При восстановлении эта копия кладётся поверх возможно рваной страницы целиком, и дальше применяются обычные мелкие записи. За это отвечает параметр full_page_writes (по умолчанию on).

Следствие: всплеск WAL после контрольной точки

Сразу после контрольной точки первые изменения каждой страницы тащат за собой полную копию - объём журнала подскакивает. Это видно в pg_stat_wal:

sql
SELECT wal_fpi, wal_bytes FROM pg_stat_wal;

wal_fpi - число full-page images; его рост коррелирует с частотой контрольных точек (см. checkpoint). Слишком частые контрольные точки раздувают WAL именно через FPI.

CRC: граница целого журнала

Каждая WAL-запись несёт контрольную сумму (CRC). При восстановлении CRC проверяется перед применением записи. Битая или оборванная на полузаписи запись означает: журнал здесь и кончился. Всё до этой точки целостно и применяется, всё после отбрасывается - так восстановление никогда не применит полузапись.

Когда отключают (почти никогда)

full_page_writes = off уменьшает WAL, но при рваной записи оставляет повреждённую страницу без шансов на восстановление. Отключают только на хранилищах, гарантирующих атомарную запись страницы целиком, и только зная это точно. Сам принцип журнала - в wal.

§ команды

bash
SELECT wal_fpi FROM pg_stat_wal;

Число full-page images — всплеск виден после контрольной точки

bash
SHOW full_page_writes;

Включена ли защита от рваной записи (должна быть on)

§ см. также

  • walWAL: принцип write-ahead и LSNWAL - последовательный журнал изменений. Правило write-ahead: запись об изменении попадает на диск раньше самой страницы данных, поэтому сбой не теряет подтверждённые данные. LSN - смещение в потоке журнала. COMMIT при synchronous_commit=on ждёт сброса журнала на диск.
  • 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. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки