Transaction ID wraparound riskini ölç (veritabanı ve tablo bazında XID yaşı)
PostgreSQLBakımKomut
-- Veritabanı bazında: autovacuum_freeze_max_age'e ve ~2^31 sınırına uzaklık
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;
-- Bağlı olunan veritabanında en yaşlı tablolar (TOAST dahil)
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;Ne yapar?
Her veritabanının en eski unfrozen XID ve multixact yaşını, autovacuum_freeze_max_age eşiğine ve wraparound sınırına oranla; bağlı olunan veritabanında ise TOAST dahil en yaşlı tabloları boyut ve son vacuum zamanıyla gösterir.
Ne zaman kullanılır?
Rutin izlemede (tipik alarm eşiği pct_of_wraparound %50 uyarı / %75 kritik), loglarda 'must be vacuumed within N transactions' uyarısı görüldüğünde ve freeze çalışmasını önceliklendirmek için.
Dikkat
pct_of_freeze_max_age 100'ü geçen tablolar için autovacuum zorunlu (anti-wraparound) vacuum başlatır; bu vacuum yoğun I/O üretir ve sonlandırılsa da yeniden başlar. Yaş düşmüyorsa sebep neredeyse her zaman xmin horizon'u tutan bir şeydir (uzun transaction, prepared transaction, replication slot, hot_standby_feedback); önce onu çöz, aksi halde VACUUM FREEZE de yaşı düşüremez. Sınıra yaklaşıldığında sunucu önce uyarı verir, son birkaç milyon XID kala yeni XID atamayı (yazmayı) reddeder. Hedefli freeze için: VACUUM (FREEZE, VERBOSE) <tablo>;