Resolver um conflito de replicação lógica (disable_on_error, SKIP)
PostgreSQLReplicação 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;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.
Relacionados
- Adicionar uma tabela a uma publication e atualizar a subscription (REFRESH PUBLICATION)
- Monitorar a replicação lógica (pg_stat_subscription, erros de apply, lag de slot)
- Sincronizar valores de sequences com o subscriber na replicação lógica
- Remover uma subscription e limpar um slot lógico órfão no publisher