lesson ── postgres-labs ── ~20 мин ── 4 шагов
VACUUM умеет рассказывать о себе - надо лишь добавить VERBOSE. Этот
отчёт читают первым делом, когда жалуются на раздувание. Сейчас ты
разберёшь его построчно: сколько версий удалено, сколько осталось,
сколько «dead but not yet removable» и что такое removable cutoff.
интерактивный sandbox
Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.
stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя
UPDATE bloat_demo SET payload = repeat('q', 200);SELECT dead_tuple_count FROM pgstattuple('bloat_demo');Теперь в таблице есть что убирать. Запомни число мёртвых версий - сверишь его с отчётом VACUUM.
✓ Мёртвые версии готовы — есть материал для отчёта.
VACUUM (VERBOSE) bloat_demo;
В выводе ищи строку про removable cutoff - это граница удаления,
выраженная числом xid. Всё, что старше неё и закоммичено, удаляемо.
Рядом - её возраст в XID: большой возраст означает застрявший
горизонт.
VERBOSE печатает отчёт как INFO-сообщения прямо в psql.
✓ Ты увидел removable cutoff — горизонт уборки числом.
В отчёте есть строка вида tuples: N removed, M remain, K are dead but not yet removable. Прогони VACUUM ещё раз на свежем мусоре и
найди число удалённых.
UPDATE bloat_demo SET payload = repeat('w', 200);VACUUM (VERBOSE) bloat_demo;
N removed - убранные мёртвые версии, M remain - живые,
K ... not yet removable - мёртвые, но новее cutoff.
✓ Строка про удалённые версии найдена и понятна.
Эта часть строки - индикатор горизонта. Если число ненулевое, в базе висит транзакция, мешающая уборке. Сейчас, без долгих транзакций, оно должно быть нулевым:
VACUUM (VERBOSE) bloat_demo;
Самостоятельно (на досуге) открой долгую транзакцию во второй сессии и убедись, что это число вырастет - именно так в проде ловят виновника раздувания.
✓ Ты прочитал ключевую строку отчёта целиком.
VACUUM VERBOSE печатает отчёт об уборке: число удалённых и оставшихся версий, «dead but not yet removable» как индикатор горизонта и removable cutoff - границу удаления в виде xid.
команды
VACUUM (VERBOSE) bloat_demo;уборка с подробным отчётомSELECT dead_tuple_count FROM pgstattuple('bloat_demo');живой замер мёртвых версийконцепции