Измерить риск 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>;