DBAtlas · Atlas d'exploitation des bases de données

Trouver ce qui retient l'horizon xmin et empêche VACUUM de supprimer les dead tuples

PostgreSQLMaintenance

Commande

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;

Ce que fait la commande

Liste, par âge de xmin, les quatre sources qui peuvent bloquer le nettoyage des dead tuples : sessions détenant des snapshots, transactions préparées, replication slots et standbys envoyant hot_standby_feedback.

Quand l'utiliser

Lorsque VACUUM VERBOSE signale 'dead row versions cannot be removed yet', que le bloat ne cesse d'augmenter et que l'âge XID ne baisse pas.

Attention

Le plus ancien xmin définit l'horizon de nettoyage ; les replication slots et le feedback des standbys affectent toutes les bases. Les transactions préparées survivent aux redémarrages ; vérifiez le propriétaire et fermez-les avec COMMIT PREPARED / ROLLBACK PREPARED '<gid>'. Supprimer un slot inutilisé casse son aval (standby, CDC) ; vérifiez d'abord le propriétaire. Exécutée sur une standby, elle n'affiche que les sessions de cette standby.

Ouvrir dans DBAtlas →

Voir aussi