跳过事务复制中的错误

对于事务复制,有两种方法可以跳过在分发过程中遇到的错误:

  • 分发代理的 -SkipErrors 参数,可用来跳过某种类型的错误。 有错误的事务将不提交,但后续的事务将提交。

  • sp_setsubscriptionxactseqno 存储过程,可用来跳过一个或多个导致错误的事务。 非 SQL Server 的订阅服务器没有此选项。

重要说明重要提示

在典型的复制处理中,应该不会遇到任何需要跳过的错误。 跳过错误时要谨慎,要了解发生错误的条件、错误的起因以及需要跳过错误或特定事务而不解决的理由。 如果在订阅服务器上跳过发布服务器上提交的事务,则这两个节点就不会完全同步,这会导致其他错误。

-SkipErrors 参数

默认情况下,发布代理遇到错误时就会停止。 如果使用 -SkipErrors 参数,并指定了预期的或不想让其干扰复制的错误,则代理就会记录错误信息,然后继续运行。 例如,如果要指定分发代理,使其记录重复键违规但继续处理后续事务,就需要指定代理跳过错误 2601(不能在具有唯一索引 '%.*ls' 的对象 '%.*ls' 中插入重复键的行。)和 2627(违反了 %ls 约束 '%.*ls'。 不能在对象 '%.*ls' 中插入重复键):

-SkipErrors 2601;2627

-SkipErrors 参数的最常见用法是使用标题为“遇到数据一致性错误时继续”的分发代理配置文件。 这样,分发代理就会跳过错误 2601、2627 和 20598(应用复制的命令时在订阅服务器上找不到该行)。 有关详细信息,请参阅复制代理配置文件。 除了此预定义的配置文件之外,还可以在创建或修改的代理配置文件中,或在命令行中,指定该参数。 有关详细信息,请参阅:

重要说明重要提示

默认情况下,触发器将在 XACT_ABORT 设置为 ON 的情况下执行。 当分发代理正在对订阅服务器应用更改时,如果触发器中的某个语句导致错误,则整批更改都将失败,而不只是单个语句。 在事务复制中,可以使用分发代理的 -SkipErrors 参数来跳过导致错误的语句。 如果在 XACT_ABORT 为 ON 的情况下使用 -SkipErrors,那么,如果某个语句导致错误,则会跳过整批更改。 如果使用了 -SkipErrors 参数,除非需要在触发器中将 XACT_ABORT 设置为 ON,否则,建议将其设置为 OFF。 若要将该选项设置为 OFF,请在触发器定义中指定 SET XACT_ABORT OFF。 有关 XACT_ABORT 的详细信息,请参阅 SET XACT_ABORT (Transact-SQL)

sp_setsubscriptionxactseqno 存储过程

当在订阅服务器上应用 sp_setsubscriptionxactseqno 时,可以用它来跳过导致错误的事务。 如果出现故障并且希望跳过一个或多个事务:

  1. 可以在分发代理停止后,在分发服务器上执行 sp_helpsubscriptionerrors。 此存储过程将返回 xact_seqno 列,该列包含各失败事务的日志序列号 (LSN)。

  2. 请执行 sp_setsubscriptionxactseqno,为 @xact_seqno 参数指定一个值。 如果要跳过所有失败的事务,请指定 sp_helpsubscriptionerrors 返回的最大日志序列号。

有关详细信息,请参阅 sp_setsubscriptionxactseqno (Transact-SQL)sp_helpsubscriptionerrors (Transact-SQL)