DBAtlas · Atlas de operaciones de bases de datos

Resolver un conflicto de replicación lógica (disable_on_error, SKIP)

PostgreSQLReplicación lógica

Comando

-- 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.

Abrir en DBAtlas →

Relacionado