DBAtlas · Atlas de operaciones de bases de datos

Monitorear el WAL retenido por los replication slots y eliminar con seguridad un slot abandonado

PostgreSQLReplicación

Comando

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;

Qué hace

Muestra cuánto WAL retiene cada slot en el primario, wal_status (reserved/extended/unreserved/lost), el margen seguro restante bajo max_slot_wal_keep_size (safe_wal_size) y los valores xmin/catalog_xmin que frenan el VACUUM; la segunda consulta elimina el slot solo si no está en uso.

Cuándo usarlo

Cuando crece el directorio pg_wal, ante una alerta de disco y en el monitoreo rutinario; para limpiar slots después de retirar definitivamente un standby o un suscriptor.

Precaución

Un slot inactivo retiene WAL sin límite y puede llenar el disco y detener el primario; un slot que retiene xmin/catalog_xmin también bloquea la limpieza de dead tuples y crea riesgo de bloat/wraparound. Eliminar un slot impide que su standby/suscriptor continúe donde lo dejó (se requiere reconstrucción); verifique su propietario antes de eliminarlo. Ejecútelo en el primario (pg_current_wal_lsn() falla en un standby).

Abrir en DBAtlas →

Relacionado