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/Vacuum, freeze, wraparound/freeze

kb/vacuum ── Vacuum, freeze, wraparound ── advanced

Заморозка и relfrozenxid

Заморозка помечает старую версию как видимую всем безусловно (бит HEAP_XMIN_FROZEN), выводя её из круговых сравнений и защищая от wraparound. relfrozenxid - граница заморозки таблицы; age(relfrozenxid) показывает её возраст в транзакциях.

view as markdownaka: vacuum-freeze, relfrozenxid, datfrozenxid

Зачем

Идентификаторы транзакций - 32-битные и идут по кругу (см. wraparound). Версия, чей xmin отстал больше чем на ~2 млрд, «переворачивается» в будущее и становится невидимой. Чтобы этого не случилось, старые версии замораживают: помечают как видимые всем и навсегда выводят из сравнений.

Как устроена

Исторически заморозка переписывала xmin в FrozenTransactionId (число 2). Современный PostgreSQL не трогает xmin, а выставляет в заголовке кортежа бит-подсказку HEAP_XMIN_FROZEN. Версия считается замороженной, исходный xid остаётся виден для отладки. Делает заморозку vacuum.

relfrozenxid и age()

У каждой таблицы есть relfrozenxid в pg_class - граница, ниже которой все версии заморожены. Полезнее смотреть её возраст:

sql
SELECT relname, age(relfrozenxid) AS xid_age
FROM pg_class WHERE relkind = 'r'
ORDER BY age(relfrozenxid) DESC LIMIT 10;

age(relfrozenxid) растёт с каждой транзакцией и падает после прохода VACUUM. На уровне базы то же показывает datfrozenxid в pg_database - минимум по всем таблицам.

Пороги заморозки

  • vacuum_freeze_min_age (50 млн) - возраст версии, начиная с которого обычный VACUUM её морозит;
  • autovacuum_freeze_max_age (200 млн) - возраст таблицы, при котором запускается агрессивный анти-wraparound проход, даже если autovacuum выключен;
  • vacuum_freeze_table_age - возраст, при котором обычный VACUUM переходит в агрессивный режим (сканирует все страницы, а не только помеченные в карте видимости).

Агрессивный проход отличается тем, что не доверяет карте видимости и проходит даже «всё видно всем» страницы - иначе заморозить версии в них было бы нельзя.

Связь с multixact

Параллельно с relfrozenxid существует relminmxid - граница заморозки multixact-идентификаторов (см. multixact). VACUUM продвигает обе.

§ команды

bash
SELECT age(relfrozenxid) FROM pg_class WHERE relname = 'flights';

Возраст таблицы в транзакциях — держать заметно ниже 200 млн

bash
VACUUM FREEZE flights;

Принудительно заморозить все пригодные версии и продвинуть relfrozenxid

bash
SELECT datname, age(datfrozenxid) FROM pg_database ORDER BY 2 DESC;

Возраст баз — какая ближе к опасной черте

§ см. также

  • wraparoundWraparound и колесо XIDxid - 32-битное число, счётчик переполняется примерно через 4 млрд транзакций. Сравнения видимости идут по кругу: версия старше текущего на ~2 млрд «переворачивается» в будущее и молча исчезает. Защита - заморозка и лестница из autovacuum, failsafe, WARNING и single-user.
  • multixactMultixact и relminmxidКогда одну строку блокируют несколько транзакций сразу (FOR SHARE, внешние ключи), вместо одного xid в xmax пишется multixact - ссылка на список участников. Это второй 32-битный счётчик со своим кругом, переполнением и границей relminmxid, за которым следят отдельно.
  • vacuumVACUUM и removable cutoffVACUUM удаляет мёртвые версии из таблицы и индексов, обновляет Free Space Map и Visibility Map, продвигает горизонт заморозки. Удаляет только версии старше removable cutoff. Обычный VACUUM не уменьшает файл - это делает VACUUM FULL под эксклюзивной блокировкой.
  • autovacuumAutovacuum: пороги и bloatAutovacuum чистит таблицу, когда мёртвых версий накопится больше порога threshold + scale_factor × reltuples (50 и 0.2 по умолчанию). scale_factor 0.2 плохо масштабируется на большие таблицы, поэтому горячим задают индивидуальные пороги. autovacuum=off ведёт к bloat и wraparound.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки