DBAtlas · Atlas de operações de banco de dados

Resolver um conflito de replicação lógica (disable_on_error, SKIP)

PostgreSQLReplicação 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;

O que faz

Quando um erro como chave duplicada, linha ausente ou problema de permissão interrompe o apply no subscriber: disable_on_error desabilita a subscription automaticamente; corrija os dados conflitantes e faça ENABLE, ou faça SKIP de toda a transação remota identificada pelo LSN 'finished at' no log.

Quando usar

Quando o apply worker falha e continua reiniciando por causa de gravações diretas no subscriber, de uma cópia inicial incompleta ou de gravações bidirecionais.

Atenção

SKIP também descarta as mudanças não conflitantes daquela transação e os dois lados divergem definitivamente; prefira corrigir os dados e compare a tabela após um SKIP. Até que o conflito seja resolvido, o slot no publisher continua acumulando WAL. Impeça gravações da aplicação nas tabelas do subscriber com privilégios.

Abrir no DBAtlas →

Relacionados