VACUUM'un dead tuple temizlemesini engelleyen xmin horizon tutucularını bul
PostgreSQLBakımKomut
SELECT 'session' AS source, pid::text AS id, usename::text AS owner, state AS detail,
age(backend_xmin) AS xmin_age
FROM pg_stat_activity
WHERE backend_xmin IS NOT NULL AND pid <> pg_backend_pid()
UNION ALL
SELECT 'prepared_xact', gid, owner::text, prepared::text, age(transaction)
FROM pg_prepared_xacts
UNION ALL
SELECT 'replication_slot', slot_name::text, slot_type, active::text,
greatest(age(xmin), age(catalog_xmin))
FROM pg_replication_slots
WHERE xmin IS NOT NULL OR catalog_xmin IS NOT NULL
UNION ALL
SELECT 'standby_feedback', application_name, usename::text, state, age(backend_xmin)
FROM pg_stat_replication
WHERE backend_xmin IS NOT NULL
ORDER BY xmin_age DESC NULLS LAST;Ne yapar?
Dead tuple temizliğini engelleyebilecek dört kaynağı (snapshot tutan oturumlar, prepared transaction'lar, replication slot'lar, hot_standby_feedback gönderen standby'lar) tek listede xmin yaşına göre sıralar.
Ne zaman kullanılır?
VACUUM VERBOSE 'dead row versions cannot be removed yet' raporladığında, bloat sürekli artıyor ve XID yaşı düşmüyorsa.
Dikkat
En yaşlı xmin temizleme sınırını belirler; replication slot'lar ve standby feedback tüm veritabanlarını etkiler. Prepared transaction'lar restart sonrasında da kalır; sahibini doğrulayıp COMMIT PREPARED / ROLLBACK PREPARED '<gid>' ile kapat. Kullanılmayan bir slot'u silmek downstream'i (standby, CDC) bozar; önce sahibini doğrula. Standby'da çalıştırılırsa yalnızca o standby'daki oturumları gösterir.