监控复制槽保留的 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、wal_status(reserved/extended/unreserved/lost)、max_slot_wal_keep_size 下剩余的安全余量(safe_wal_size),以及阻碍 VACUUM 的 xmin/catalog_xmin 值;第二个查询只在复制槽未被使用时删除它。
适用场景
当 pg_wal 目录增长、出现磁盘告警以及例行监控时;在备库或订阅者被永久移除后清理复制槽。
注意
非活动的复制槽会无限制地保留 WAL,可能填满磁盘并使主库停止;持有 xmin/catalog_xmin 的复制槽还会阻止死元组清理,造成膨胀/回卷风险。删除复制槽后,其备库/订阅者将无法从中断处继续(需要重建);删除前请核实其所有者。请在主库上运行(pg_current_wal_lsn() 在备库上会失败)。