Compartilhar via


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 subseqüentes 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 pára. 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 subseqüentes, 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 o XACT_ABORT ON, todo o lote de alterações será ignorado se uma instrução causar um erro. A menos que você exija que o XACT_ABORT seja definido para ON nos gatilhos, recomendamos que você configure para 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 seqüê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).