DBAtlas · Atlas für Datenbankbetrieb

Von Replication Slots zurückgehaltenes WAL überwachen und einen verwaisten Slot sicher löschen

PostgreSQLReplikation

Befehl

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;

Was es tut

Zeigt, wie viel WAL jeder Slot auf der Primary zurückhält, wal_status (reserved/extended/unreserved/lost), die verbleibende Sicherheitsreserve unter max_slot_wal_keep_size (safe_wal_size) und die xmin-/catalog_xmin-Werte, die VACUUM aufhalten; die zweite Abfrage löscht den Slot nur, wenn er nicht genutzt wird.

Wann einsetzen

Wenn das Verzeichnis pg_wal wächst, bei einem Plattenalarm und im Routine-Monitoring; zur Bereinigung von Slots, nachdem ein Standby oder Subscriber dauerhaft entfernt wurde.

Vorsicht

Ein inaktiver Slot hält WAL unbegrenzt zurück und kann die Platte füllen und die Primary stoppen; ein Slot, der xmin/catalog_xmin hält, blockiert zudem die Bereinigung toter Tupel und erzeugt Bloat-/Wraparound-Risiko. Nach dem Löschen eines Slots kann sein Standby/Subscriber nicht mehr dort weitermachen, wo er aufgehört hat (Neuaufbau nötig); prüfe vor dem Löschen den Eigentümer. Auf der Primary ausführen (pg_current_wal_lsn() schlägt auf einem Standby fehl).

In DBAtlas öffnen →

Verwandte Einträge