Medir el riesgo de transaction ID wraparound (antigüedad de XID por base de datos y tabla)
PostgreSQLMantenimientoComando
-- 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;Qué hace
Muestra la antigüedad del XID no congelado más antiguo y de multixact de cada base de datos respecto a autovacuum_freeze_max_age y al límite de wraparound; en la base de datos actual, las tablas más antiguas (incluido TOAST) con su tamaño y la hora del último vacuum.
Cuándo usarlo
En el monitoreo rutinario (umbrales típicos: pct_of_wraparound 50% advertencia / 75% crítico), cuando el log muestra 'must be vacuumed within N transactions', y para priorizar el trabajo de freeze.
Precaución
En las tablas donde pct_of_freeze_max_age supera 100, autovacuum inicia un vacuum obligatorio (anti-wraparound); es intensivo en I/O y se reinicia aunque se termine. Si la antigüedad no baja, la causa casi siempre es algo que frena el xmin horizon (transacción larga, prepared transaction, replication slot, hot_standby_feedback); corríjalo primero, o ni siquiera VACUUM FREEZE podrá bajar la antigüedad. Cerca del límite el servidor primero advierte y luego se niega a asignar XID nuevos (escrituras) cuando solo quedan unos pocos millones. Para un freeze dirigido: VACUUM (FREEZE, VERBOSE) <table>;