DBAtlas · Атлас эксплуатации баз данных

Измерить риск wraparound идентификаторов транзакций (возраст XID по базам данных и таблицам)

PostgreSQLОбслуживание

Команда

-- Per database: distance to autovacuum_freeze_max_age and the ~2^31 limit
SELECT datname,
       age(datfrozenxid) AS xid_age,
       mxid_age(datminmxid) AS mxid_age,
       round(100.0 * age(datfrozenxid) / current_setting('autovacuum_freeze_max_age')::int, 1) AS pct_of_freeze_max_age,
       round(100.0 * age(datfrozenxid) / 2147483647, 1) AS pct_of_wraparound
FROM pg_database
ORDER BY age(datfrozenxid) DESC;

-- Oldest tables in the current database (including TOAST)
SELECT c.oid::regclass AS table_name,
       greatest(age(c.relfrozenxid), age(t.relfrozenxid)) AS xid_age,
       mxid_age(c.relminmxid) AS mxid_age,
       pg_size_pretty(pg_total_relation_size(c.oid)) AS total_size,
       s.last_autovacuum,
       s.last_vacuum
FROM pg_class c
LEFT JOIN pg_class t ON t.oid = c.reltoastrelid
LEFT JOIN pg_stat_all_tables s ON s.relid = c.oid
WHERE c.relkind IN ('r', 'm')
ORDER BY 2 DESC
LIMIT 20;

Что делает

Показывает для каждой базы данных возраст самого старого незамороженного XID и multixact относительно autovacuum_freeze_max_age и предела wraparound; в текущей базе — самые старые таблицы (включая TOAST) с размером и временем последнего vacuum.

Когда использовать

В регулярном мониторинге (типичные пороги: pct_of_wraparound 50% — предупреждение / 75% — критично), когда в журнале появляется 'must be vacuumed within N transactions', и для приоритизации работ по freeze.

Внимание

Для таблиц, у которых pct_of_freeze_max_age превышает 100, autovacuum запускает обязательный (anti-wraparound) vacuum; он создаёт высокую нагрузку I/O и перезапускается даже после завершения. Если возраст не снижается, причина почти всегда в чём-то, что сдерживает горизонт xmin (долгая транзакция, prepared transaction, слот репликации, hot_standby_feedback); сначала устраните это, иначе даже VACUUM FREEZE не сможет снизить возраст. Вблизи предела сервер сначала предупреждает, а затем, когда остаётся лишь несколько миллионов, отказывается назначать новые XID (запись). Для точечного freeze: VACUUM (FREEZE, VERBOSE) <table>;

Открыть в DBAtlas →

Связанные материалы