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

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

Wraparound и колесо XID

xid - 32-битное число, счётчик переполняется примерно через 4 млрд транзакций. Сравнения видимости идут по кругу: версия старше текущего на ~2 млрд «переворачивается» в будущее и молча исчезает. Защита - заморозка и лестница из autovacuum, failsafe, WARNING и single-user.

view as markdownaka: xid-wraparound, transaction-wraparound, xid-wheel

Откуда берётся

Каждой изменяющей транзакции PostgreSQL выдаёт xid - следующее значение 32-битного счётчика. Видимость версии решается сравнением xmin/xmax со снимком: меньше - прошлое, больше - будущее. Но 32 бита вмещают лишь ~4 млрд значений, и на активной базе счётчик переполняется за недели-месяцы.

Круг вместо прямой

Чтобы сравнения работали после обнуления, PostgreSQL считает их на круге: для любого xid ~2 млрд значений назад - прошлое, ~2 млрд вперёд - будущее. Ловушка: версия, чей xmin отстал больше чем на 2 млрд, «перепрыгивает» в будущее и становится невидимой. Данные физически на месте, но СУБД считает их несуществующими - это и есть wraparound, молчаливая потеря данных.

Защита: заморозка

Не дать ни одной версии состариться больше чем на 2 млрд - задача заморозки (см. freeze). VACUUM морозит старые версии, выводя их из круга. Пока заморозка поспевает, wraparound невозможен.

Лестница защиты

ВозрастЧто включается
≥ 200 млн (autovacuum_freeze_max_age)анти-wraparound autovacuum, даже при выключенном autovacuum
≥ 1.6 млрд (vacuum_failsafe_age)failsafe: VACUUM бросает очистку индексов и паузы, гонит заморозку
< 40 млн до краяWARNING в лог с обратным отсчётом
< 3 млн до краясервер отказывается выдавать xid, база встаёт

Из остановившейся базы выходят через VACUUM в однопользовательском режиме:

bash
postgres --single -D /var/lib/postgresql/data mydb
sql
backend> VACUUM;

Как не попасть

До single-user доходят почти всегда те, кто отключил autovacuum «ради производительности». Анти-wraparound autovacuum - первая и обычно достаточная линия обороны (см. autovacuum). Следить за приближением нужно по age(relfrozenxid) и не забывать про второй счётчик - multixact.

§ команды

bash
SELECT max(age(relfrozenxid)) FROM pg_class WHERE relkind = 'r';

Самая старая таблица в базе — насколько близко к 200 млн

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

Возраст баз — глобальная близость к wraparound

§ см. также

  • freezeЗаморозка и relfrozenxidЗаморозка помечает старую версию как видимую всем безусловно (бит HEAP_XMIN_FROZEN), выводя её из круговых сравнений и защищая от wraparound. relfrozenxid - граница заморозки таблицы; age(relfrozenxid) показывает её возраст в транзакциях.
  • multixactMultixact и relminmxidКогда одну строку блокируют несколько транзакций сразу (FOR SHARE, внешние ключи), вместо одного xid в xmax пишется multixact - ссылка на список участников. Это второй 32-битный счётчик со своим кругом, переполнением и границей relminmxid, за которым следят отдельно.
  • autovacuumAutovacuum: пороги и bloatAutovacuum чистит таблицу, когда мёртвых версий накопится больше порога threshold + scale_factor × reltuples (50 и 0.2 по умолчанию). scale_factor 0.2 плохо масштабируется на большие таблицы, поэтому горячим задают индивидуальные пороги. autovacuum=off ведёт к bloat и wraparound.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки