Ignorando erros na replicação transacional

Para replicação transacional, existem dois modos para ignorar erros caso sejam encontrados durante o processo de distribuição:

  • O parâmetro -SkipErrors do Distribution Agent, que permite ignorar erros de um certo tipo. A transação com o erro não é confirmada, mas as transações subsequentes são.

  • O procedimento armazenado sp_setsubscriptionxactseqno, que permite ignorar uma ou mais transações que causam erros. Esta opção não está disponível para não Assinantes do SQL Server.

Observação importanteImportante

Em um processamento típico de replicação, você não deveria encontrar qualquer erro que necessite ser ignorado. Os erros devem ser ignorados com cuidado e com entendimento do que é a condição de erro, por que está ocorrendo e por que o erro em uma transação específica precisa ser ignorado ao invés de solucionado. Se as transações confirmadas no Publicador forem ignoradas no Assinante, os dois nós não estarão completamente sincronizados, o que pode causar mais erros.

O parâmetro -SkipErrors

Por padrão, quando o Distribution Agent encontra um erro, o agente para. Se você usar o parâmetro -SkipErrors e especificar os erros esperados ou os erros que você não quer que interfiram com a replicação, o agente registrará um log de informação do erro e então continuará em execução. Por exemplo, se você quer especificar que o Distribution Agent deve registrar um log para violações de chaves duplicadas, porém continuar a processar as transações subsequentes, especifique que o agente deve ignorar erros 2601 (Não é possível inserir uma linha de chaves duplicadas no objeto '%.*ls' com índice exclusivo '%.*ls'.) e 2627 (Violação da restrição '%.*ls' do %ls. Não é possível inserir chave duplicada no objeto '%.* ls'):

-SkipErrors 2601:2627

A maneira mais comum de usar o parâmetro -SkipErrors é usar o perfil do Distribution Agent com o nome Continuar em caso de erros de consistência de dados. O Distribution Agente ignorará os erros 2601, 2627 e 20598 (a linha não foi localizada no Assinante ao aplicar o comando replicado). Para obter mais informações, consulte Perfis do Replication Agent. Além desse perfil predefinido, é possível especificar um parâmetro de um perfil de agente que você cria ou modifica ou na linha de comando. Para obter mais informações, consulte:

Observação importanteImportante

Por padrão, os gatilhos são executados com a configuração XACT_ABORT ON. Se uma instrução dentro de um gatilho causar um erro enquanto o Distribution Agent estiver aplicando as alterações no Assinante, todo o lote de alterações falhará, o que não ocorre com a instrução individual. Na replicação transacional, você pode usar o parâmetro -SkipErrors do Distribution Agent para ignorar instruções que causam erros. Se -SkipErrors for usado com XACT_ABORT ON, todo o lote de alterações será ignorado se uma instrução causar um erro. A menos que você precise configurar XACT_ABORT como ON nos gatilhos, recomendamos que você configure como OFF se estiver usando o parâmetro -SkipErrors. Para configurar a opção Off, especifique SET XACT_ABORT OFF na definição do gatilho. Para obter mais informações sobre o XACT_ABORT, consulte SET XACT_ABORT (Transact-SQL).

O procedimento armazenado sp_setsubscriptionxactseqno

O procedimento armazenado sp_setsubscriptionxactseqno, pode ser usado para ignorar uma ou mais transações que causam erros quando aplicado no Assinante. Caso ocorra uma falha e você deseja ignorar uma ou mais transações:

  1. Execute sp_helpsubscriptionerrors no Distribuidor depois que o Distribution Agent parar. Este procedimento armazenado retorna a coluna xact_seqno, que contém o número de sequência de log (LSN) para cada transação que falhou.

  2. Execute sp_setsubscriptionxactseqno, especificando um valor para o parâmetro @xact_seqno. Se você deseja ignorar todas as transações com falha, especifique o maior LSN retornado pelo sp_helpsubscriptionerrors.

Para obter mais informações, consulte sp_setsubscriptionxactseqno (Transact-SQL) e sp_helpsubscriptionerrors (Transact-SQL).