本文介绍分发代理中的参数用法-SkipErrors。
原始产品版本:SQL Server
原始 KB 数: 327817
总结
Microsoft SQL Server 在分发代理中包含新参数,该参数-SkipErrors允许分发代理跳过事务复制中指示的错误并继续分发过程。
以下摘录摘自 SQL Server 联机丛书中的 “处理代理错误” 主题:
在典型的复制处理下,不应遇到需要跳过的任何错误。 在事务复制期间跳过错误的功能适用于预期错误且不希望它们影响复制的独特情况(例如,在日志传送期间故障转移到辅助发布服务器时)。
Microsoft建议谨慎地使用此参数,并且仅在你对以下内容有充分了解时才使用此参数:
- 错误指示的内容。
- 发生错误的原因。
- 为什么最好跳过错误而不是解决错误。
如果不知道这些项的答案,则不适当的参数使用 -SkipErrors 可能会导致发布服务器和订阅服务器之间的数据不一致。 本文介绍错误地使用参数时可能发生的 -SkipErrors 一些问题。
详细信息
在事务复制中,发布服务器上的数据更改将传播到事务单元中的订阅服务器。
在一个事务中,可能有多个命令。 默认情况下,如果一个命令失败,整个复制事务会在订阅服务器上回滚。 如果添加-SkipErrors参数以允许分发代理跳过某些错误,则导致此错误的单个命令不会应用于订阅服务器,但应用同一事务中的所有其他命令。 在这种情况下,复制事务仅部分应用于订阅服务器,因此可能会导致发布服务器和订阅服务器之间的数据不一致。
例如:
有一个事务等待复制到名为 T1 的订阅服务器表。 此事务包括 100 个 insert 语句。 当它应用于订阅服务器时,前 90 个插入过程正确;但是,第九十一次插入语句失败,主键冲突错误 2627 发生。
如果不使用 -SkipErrors 参数(默认行为):
默认情况下,整个事务回滚,所有 100 条新记录都不会插入订阅表中。 在这种情况下,必须修复复制错误,以便可以将事务重新应用到订阅服务器。
使用 -SkipErrors 参数时:
分发代理记录分发代理历史记录中的错误,它会跳过此错误,然后继续分发过程。 因此,除了导致错误的九十一条新记录外,其他 99 条新记录将插入订阅表中。 即使你在订阅服务器上手动修复错误,分发代理也不会重新应用此事务。 因此,在这种情况下,订阅服务器缺少第九十一条新记录,并且出现数据不一致问题。
此外,还必须注意,在 SQL Server 2000 中,分发代理通常由多个发布共享(默认情况下,每个发布数据库和订阅数据库对有一个分发代理),因此,如果将参数添加到-SkipErrors分发代理作业,它将影响此代理服务的所有发布。 在 SQL 2005 和 SQL 2008 版本中,事务复制默认对在新建发布向导中创建的发布使用独立的代理。 对于使用 sp_addpublication 存储过程创建的发布,默认行为是使用共享代理。
若要对特定发布使用 -SkipErrors 参数,请使用仅为一个订阅提供服务的独立代理。 若要使用独立代理,请遵循版本的步骤:
SQL Server 2000
在 SQL Server Enterprise Manager 中,右键单击发布,单击
Properties,然后在“订阅选项”选项卡上,单击使用独立于此数据库选项的其他发布的分发代理。注意
向此发布添加任何订阅后,无法打开此选项。
将
-SkipErrors参数添加到特定订阅的分发代理。
SQL Server 2005 和 SQL Server 2008
在 SQL Server Management Studio 中,导航到“复制”,然后在“本地发布”部分中右键单击该发布,单击“属性”,然后在“订阅选项”页上,将“独立分发代理”的值从 False 更改为 True。
注意
向此发布添加任何订阅后,无法打开此选项。
将
-SkipErrors参数添加到特定订阅的分发代理。
有关详细信息,请参阅以下部分: