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

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

Multixact и relminmxid

Когда одну строку блокируют несколько транзакций сразу (FOR SHARE, внешние ключи), вместо одного xid в xmax пишется multixact - ссылка на список участников. Это второй 32-битный счётчик со своим кругом, переполнением и границей relminmxid, за которым следят отдельно.

view as markdownaka: multixact-id, relminmxid, multixact-wraparound

Зачем понадобился

В xmax строки обычно пишется один xid - транзакция, удалившая или заблокировавшая версию. Но строку могут заблокировать несколько транзакций одновременно: SELECT ... FOR SHARE, проверки внешних ключей, совместные блокировки. Один xid тут не подходит - блокировщиков много.

Тогда PostgreSQL заводит multixact: отдельный идентификатор, за которым стоит список транзакций-участников и их режимы блокировки. В xmax строки оказывается этот multixact-id, а не обычный xid.

Второй счётчик, второй wraparound

Multixact-идентификаторы - тоже 32-битный счётчик, со своим кругом и своим переполнением. У него своя инфраструктура:

  • relminmxid (в pg_class) - граница заморозки multixact таблицы, аналог relfrozenxid;
  • autovacuum_multixact_freeze_max_age (400 млн) - возраст, при котором запускается анти-wraparound проход по multixact;
  • данные хранятся в SLRU-каталогах pg_multixact/.

VACUUM морозит multixact так же, как обычные версии (см. freeze).

Почему его легко проглядеть

Типовой мониторинг следит за age(relfrozenxid) и упускает age(relminmxid). На нагрузке с обилием блокировок строк или внешних ключей multixact-счётчик может побежать к краю быстрее обычного. Поэтому следить нужно за обоими:

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

Симптомы переполнения и лестница защиты те же, что у обычного wraparound: анти-wraparound autovacuum, затем отказ базы принимать команды.

§ команды

bash
SELECT relname, mxid_age(relminmxid) FROM pg_class ORDER BY 2 DESC LIMIT 5;

Возраст multixact-границы по таблицам — отдельно от relfrozenxid

bash
SELECT datname, mxid_age(datminmxid) FROM pg_database ORDER BY 2 DESC;

Возраст multixact на уровне баз

§ см. также

  • wraparoundWraparound и колесо XIDxid - 32-битное число, счётчик переполняется примерно через 4 млрд транзакций. Сравнения видимости идут по кругу: версия старше текущего на ~2 млрд «переворачивается» в будущее и молча исчезает. Защита - заморозка и лестница из autovacuum, failsafe, WARNING и single-user.
  • freezeЗаморозка и relfrozenxidЗаморозка помечает старую версию как видимую всем безусловно (бит HEAP_XMIN_FROZEN), выводя её из круговых сравнений и защищая от wraparound. relfrozenxid - граница заморозки таблицы; age(relfrozenxid) показывает её возраст в транзакциях.
  • vacuumVACUUM и removable cutoffVACUUM удаляет мёртвые версии из таблицы и индексов, обновляет Free Space Map и Visibility Map, продвигает горизонт заморозки. Удаляет только версии старше removable cutoff. Обычный VACUUM не уменьшает файл - это делает VACUUM FULL под эксклюзивной блокировкой.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки