Mesurer le risque de wraparound des identifiants de transaction (âge XID par base et par table)
PostgreSQLMaintenanceCommande
-- 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;Ce que fait la commande
Affiche pour chaque base l'âge du plus ancien XID non gelé et du multixact par rapport à autovacuum_freeze_max_age et à la limite de wraparound ; dans la base courante, les tables les plus anciennes (TOAST compris) avec leur taille et l'heure du dernier vacuum.
Quand l'utiliser
En supervision de routine (seuils typiques : pct_of_wraparound 50 % avertissement / 75 % critique), lorsque le journal affiche 'must be vacuumed within N transactions', et pour prioriser le travail de freeze.
Attention
Pour les tables où pct_of_freeze_max_age dépasse 100, autovacuum lance un vacuum obligatoire (anti-wraparound) ; il est lourd en E/S et redémarre même s'il est terminé. Si l'âge ne baisse pas, la cause est presque toujours un élément qui retient l'horizon xmin (transaction longue, transaction préparée, replication slot, hot_standby_feedback) ; corrigez-le d'abord, sinon même VACUUM FREEZE ne peut pas faire baisser l'âge. Près de la limite, le serveur avertit d'abord, puis refuse d'attribuer de nouveaux XID (écritures) lorsqu'il n'en reste que quelques millions. Pour un freeze ciblé : VACUUM (FREEZE, VERBOSE) <table>;