Omitir errores en la replicación transaccional

En la replicación transaccional, existen dos formas de omitir los errores si se producen durante el proceso de distribución:

  • Mediante el parámetro -SkipErrors del Agente de distribución, que permite omitir errores de cierto tipo. La transacción con el error no se confirma, pero sí las transacciones siguientes.

  • Mediante el procedimiento almacenado sp_setsubscriptionxactseqno, que permite omitir una o varias transacciones que provocan errores. Esta opción no está disponible para suscriptores que no son de SQL Server.

Nota importanteImportante

En el proceso de replicación habitual, no debería producirse ningún error que necesite omitir. Los errores deben omitirse con cuidado y conociendo cuál es la condición del error, por qué se produce y por qué es necesario omitir el error o la transacción específica en vez de resolverla. Si las transacciones confirmadas en el publicador se omiten en el suscriptor, los dos nodos no estarán completamente sincronizados, lo que puede provocar más errores.

Parámetro -SkipErrors

De forma predeterminada, el Agente de distribución se detiene cuando encuentra un error. Si se usa el parámetro -SkipErrors y se especifican los errores que se esperan o que no se desea que interfieran con la replicación, el agente registrará la información del error y continuará ejecutándose. Por ejemplo, si desea especificar que el Agente de distribución debe registrar las infracciones de clave duplicada, pero desea seguir con el proceso de la siguiente transacción, especifique que el agente debe omitir errores 2601 (No se puede insertar una fila de clave duplicada en el objeto '%.*ls' con índice único '%.*ls'.) y 2627 (Infracción de la restricción %ls '%.*ls'. No se puede insertar una clave duplicada en el objeto '%.*ls'.):

-SkipErrors 2601:2627

La forma más habitual de usar el parámetro -SkipErrors es emplear el perfil del Agente de distribución denominado Continuar después de errores de coherencia de datos. El Agente de distribución omitirá los errores 2601, 2627 y 20598 (No se encontró la fila en el suscriptor al aplicar el comando replicado). Para obtener más información, vea Perfiles del Agente de replicación. Además de en este perfil predefinido, el parámetro se puede especificar en el perfil del agente que se crea o modifica, o en la línea de comandos. Para obtener más información, vea:

Nota importanteImportante

De forma predeterminada, los desencadenadores se ejecutan con XACT_ABORT establecido en ON. Si una instrucción en un desencadenador produce un error mientras el Agente de distribución aplica cambios en el suscriptor, todo el lote de cambios tendrá errores, en vez de la instrucción individual. En la replicación transaccional, puede usar el parámetro -SkipErrors del Agente de distribución para omitir las instrucciones que provocan errores. Si se usa -SkipErrors con XACT_ABORT ON, se omite todo el lote de cambios si una instrucción produce un error. A menos que necesite establecer XACT_ABORT en ON en los desencadenadores, se recomienda que lo establezca en OFF si usa el parámetro -SkipErrors. Para establecer la opción en OFF, especifique SET XACT_ABORT OFF en la definición del desencadenador. Para obtener más información sobre XACT_ABORT, vea SET XACT_ABORT (Transact-SQL).

Procedimiento almacenado sp_setsubscriptionxactseqno

El procedimiento almacenado sp_setsubscriptionxactseqno se puede utilizar para omitir una o varias transacciones que producen errores al aplicarlas en el suscriptor. Si existe un error y desea omitir una o varias transacciones:

  1. Ejecute sp_helpsubscriptionerrors en el distribuidor después de que se detenga el Agente de distribución. Este procedimiento almacenado devuelve la columna xact_seqno, que contiene el número de secuencia de registro (LSN) de cada transacción errónea.

  2. Ejecute sp_setsubscriptionxactseqno, especificando un valor en el parámetro @xact_seqno. Si desea omitir todas las transacciones erróneas, especifique el mayor LSN devuelto por sp_helpsubscriptionerrors.

Para obtener más información, vea sp_setsubscriptionxactseqno (Transact-SQL) y sp_helpsubscriptionerrors (Transact-SQL).