レプリケーションスロットが保持する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の値を表示する。2つ目のクエリは使用中でない場合のみスロットを削除する。
使用する場面
pg_walディレクトリが増大したとき、ディスクアラート時、定期監視で。スタンバイやサブスクライバを恒久的に削除した後のスロット整理に。
注意
非アクティブなスロットは無制限にWALを保持し、ディスクを満杯にしてプライマリを停止させる可能性がある。xmin/catalog_xminを保持するスロットはデッドタプルのクリーンアップも妨げ、肥大化/周回のリスクを生む。スロットを削除すると、そのスタンバイ/サブスクライバは中断した位置から再開できなくなる(再構築が必要)。削除前に所有者を確認する。プライマリで実行する(スタンバイではpg_current_wal_lsn()が失敗する)。