Мониторинг WAL, удерживаемого слотами репликации, и безопасное удаление заброшенного слота
PostgreSQLРепликацияКоманда
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;Что делает
Показывает, сколько WAL удерживает каждый слот на primary, wal_status (reserved/extended/unreserved/lost), оставшийся безопасный запас в пределах max_slot_wal_keep_size (safe_wal_size) и значения xmin/catalog_xmin, сдерживающие VACUUM; второй запрос удаляет слот, только если он не используется.
Когда использовать
Когда растёт каталог pg_wal, при алерте по диску и в регулярном мониторинге; для очистки слотов после окончательного удаления standby или подписчика.
Внимание
Неактивный слот удерживает WAL без ограничений и может заполнить диск и остановить primary; слот, удерживающий xmin/catalog_xmin, также блокирует очистку мёртвых кортежей и создаёт риск раздувания/wraparound. После удаления слота его standby/подписчик не сможет продолжить с того места, где остановился (потребуется пересоздание); перед удалением проверьте его владельца. Выполняйте на primary (pg_current_wal_lsn() на standby завершается ошибкой).