DBAtlas · Атлас эксплуатации баз данных

Мониторинг 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 завершается ошибкой).

Открыть в DBAtlas →

Связанные материалы