Resolver un conflicto de replicación lógica (disable_on_error, SKIP)
PostgreSQLReplicación lógicaComando
-- 1) Prevent a failing apply worker from looping forever:
ALTER SUBSCRIPTION sub_app SET (disable_on_error = true);
-- 2) Find the finish LSN of the conflicting transaction in the subscriber log:
-- CONTEXT: ... in transaction 749, finished at 0/5035378
-- 3a) Preferred: fix/delete the conflicting row on the subscriber, then re-enable:
ALTER SUBSCRIPTION sub_app ENABLE;
-- 3b) Or skip the whole remote transaction (NONE of its changes are applied on the subscriber):
ALTER SUBSCRIPTION sub_app SKIP (lsn = '0/5035378');
ALTER SUBSCRIPTION sub_app ENABLE;
SELECT subname, subenabled, subskiplsn FROM pg_subscription;Qué hace
Cuando un error como una clave duplicada, una fila inexistente o un problema de permisos detiene el apply en el suscriptor: disable_on_error deshabilita automáticamente la suscripción; corrija los datos en conflicto y ejecute ENABLE, o use SKIP para omitir toda la transacción remota identificada por el LSN 'finished at' del log.
Cuándo usarlo
Cuando el apply worker falla y se reinicia continuamente por escrituras directas en el suscriptor, una copia inicial incompleta o escrituras bidireccionales.
Precaución
SKIP también descarta los cambios no conflictivos de esa transacción y ambos lados divergen definitivamente; es preferible corregir los datos, y compare la tabla tras un SKIP. Hasta que se resuelva el conflicto, el slot del publicador sigue acumulando WAL. Impida con privilegios las escrituras de la aplicación en las tablas del suscriptor.
Relacionado
- Añadir una tabla a una publicación y refrescar la suscripción (REFRESH PUBLICATION)
- Monitorear la replicación lógica (pg_stat_subscription, errores de apply, lag de slots)
- Sincronizar los valores de las secuencias en el suscriptor en la replicación lógica
- Eliminar una suscripción y limpiar un slot lógico huérfano en el publicador