Risiko eines Transaction-ID-Wraparounds messen (XID-Alter je Datenbank und Tabelle)
PostgreSQLWartungBefehl
-- 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;Was es tut
Zeigt für jede Datenbank das Alter der ältesten nicht eingefrorenen XID und Multixact im Verhältnis zu autovacuum_freeze_max_age und zur Wraparound-Grenze; in der aktuellen Datenbank die ältesten Tabellen (inkl. TOAST) mit Größe und letzter Vacuum-Zeit.
Wann einsetzen
Im Routine-Monitoring (typische Schwellen: pct_of_wraparound 50 % Warnung / 75 % kritisch), wenn das Log 'must be vacuumed within N transactions' zeigt, und um Freeze-Arbeiten zu priorisieren.
Vorsicht
Bei Tabellen mit pct_of_freeze_max_age über 100 startet Autovacuum ein verpflichtendes Vacuum (Anti-Wraparound); es ist I/O-intensiv und startet auch nach dem Beenden neu. Sinkt das Alter nicht, ist die Ursache fast immer etwas, das den xmin-Horizont zurückhält (lange Transaktion, Prepared Transaction, Replication Slot, hot_standby_feedback); behebe das zuerst, sonst kann selbst VACUUM FREEZE das Alter nicht senken. Nahe der Grenze warnt der Server zuerst und verweigert dann die Vergabe neuer XIDs (Schreibvorgänge), wenn nur noch wenige Millionen übrig sind. Für ein gezieltes Freeze: VACUUM (FREEZE, VERBOSE) <table>;