Surveiller le WAL retenu par les replication slots et supprimer sans risque un slot abandonné
PostgreSQLRéplicationCommande
SELECT slot_name, slot_type, database, active, active_pid, wal_status,
pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS retained_wal,
pg_size_pretty(safe_wal_size) AS safe_wal_size,
xmin, catalog_xmin
FROM pg_replication_slots
ORDER BY pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) DESC NULLS LAST;
-- Safe drop: drops only if not active (returns 0 rows if active)
SELECT pg_drop_replication_slot(slot_name) FROM pg_replication_slots WHERE slot_name = '<slot>' AND NOT active;Ce que fait la commande
Montre sur la primaire combien de WAL chaque slot retient, wal_status (reserved/extended/unreserved/lost), la marge de sécurité restante sous max_slot_wal_keep_size (safe_wal_size), et les valeurs xmin/catalog_xmin qui retiennent VACUUM ; la seconde requête supprime le slot uniquement s'il n'est pas utilisé.
Quand l'utiliser
Lorsque le répertoire pg_wal grossit, sur une alerte disque et en supervision de routine ; pour le nettoyage des slots après la suppression définitive d'une standby ou d'un abonné.
Attention
Un slot inactif retient le WAL sans limite et peut remplir le disque et arrêter la primaire ; un slot retenant xmin/catalog_xmin bloque aussi le nettoyage des dead tuples et crée un risque de bloat/wraparound. Supprimer un slot empêche sa standby/son abonné de reprendre là où il s'était arrêté (une reconstruction est nécessaire) ; vérifiez son propriétaire avant de le supprimer. À exécuter sur la primaire (pg_current_wal_lsn() échoue sur une standby).