lesson ── postgres-labs ── ~22 мин ── 5 шагов
wal_level задаёт, насколько подробно журнал описывает изменения. Сервер
работает на уровне по умолчанию - его и узнаем. А потом через
pg_walinspect разберём журнал на записи и увидим, какая подсистема их
породила: строки таблиц, индексы, коммиты, full-page images. Перед шагами
предскажи, записи какой подсистемы будут преобладать.
интерактивный sandbox
Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.
stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя
SHOW wal_level;
Предскажи значение: это уровень по умолчанию, на котором работает большинство баз - он позволяет физическую репликацию, архивацию и PITR.
✓ Уровень — replica: репликация и PITR возможны, логическое декодирование нет.
CREATE TABLE wal_inspect_demo (id serial PRIMARY KEY, payload text);
INSERT INTO wal_inspect_demo (payload)
SELECT repeat('x', 100) FROM generate_series(1, 500);UPDATE wal_inspect_demo SET payload = repeat('y', 100);Вставки и обновления по индексированной таблице породили записи и в Heap (строки), и в Btree (индекс), и Transaction (коммиты).
✓ Материал для разбора готов — журнал пополнился записями.
SELECT "resource_manager/record_type" AS rmgr, count, record_size
FROM pg_get_wal_stats(pg_current_wal_lsn() - 200000,
pg_current_wal_lsn(), false)
ORDER BY count DESC;
Колонка ресурс-менеджера (в выводе её имя resource_manager/record_type,
поэтому берём её в кавычки) показывает источник: Heap - строки
таблиц, Btree - индексы, Transaction - коммиты и аборты, XLOG -
служебные записи. Найди строку Heap.
✓ Записи Heap найдены — это изменения строк таблиц в журнале.
SELECT start_lsn, resource_manager, record_type, record_length
FROM pg_get_wal_records_info(pg_current_wal_lsn() - 200000,
pg_current_wal_lsn())
WHERE resource_manager = 'Heap'
LIMIT 10;
Вот они, отдельные записи: каждая со своим LSN, типом (INSERT, UPDATE, HOT_UPDATE) и размером. Так абстрактный журнал превращается в конкретный список операций.
✓ Ты видишь отдельные записи журнала — INSERT и UPDATE как они есть.
CHECKPOINT;
UPDATE wal_inspect_demo SET payload = repeat('z', 100);SELECT sum(fpi_size) AS total_fpi_bytes
FROM pg_get_wal_stats(pg_current_wal_lsn() - 200000,
pg_current_wal_lsn(), false);
Первое изменение каждой страницы после контрольной точки тащит за
собой полную копию страницы. Предскажи: будет ли total_fpi_bytes
больше нуля?
FPI пишутся при первом касании страницы после контрольной точки.
✓ Full-page images в журнале — ты увидел цену надёжности в байтах.
wal_level задаёт детальность журнала (replica по умолчанию). pg_walinspect показывает содержимое WAL из SQL: pg_get_wal_stats - по подсистемам (Heap, Btree, Transaction, XLOG), pg_get_wal_records_info - отдельные записи. fpi_size показывает объём full-page images.
команды
SHOW wal_level;уровень детализации журналаSELECT resource_manager, count FROM pg_get_wal_stats(pg_current_wal_lsn()-200000, pg_current_wal_lsn(), false);записи по подсистемамSELECT * FROM pg_get_wal_records_info(pg_current_wal_lsn()-200000, pg_current_wal_lsn());отдельные записи журналаконцепции