相关文章推荐
无邪的硬盘  ·  MSSQLSERVER_7391 - ...·  2 周前    · 
酷酷的日光灯  ·  临时表 | TiDB 文档中心·  1 周前    · 
打酱油的稀饭  ·  Import Error from ...·  2 年前    · 
老实的钥匙扣  ·  Android ...·  2 年前    · 
原始 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管理器”中,右键单击发布,单击 , Properties 然后在“ 订阅选项” 选项卡上,单击 使用独立于此数据库的其他发布的分发代理 选项。

    向此发布添加任何订阅后,无法打开此选项。

  • -SkipErrors 将 参数添加到特定订阅的分发代理。

    SQL Server 2005 和 SQL Server 2008

  • 在 SQL Server Management Studio 中,导航到 “复制 ”,然后在“ 本地发布 ”部分中右键单击发布,单击“ 属性” ,然后在“ 订阅选项” 页上,将 “独立分发代理 ”的值从 False 更改为 True

    向此发布添加任何订阅后,无法打开此选项。

  • -SkipErrors 将 参数添加到特定订阅 的分发代理

    有关详细信息,请参阅:

  • 复制代理管理

  • 跳过事务复制中的错误

  • sp_addpublication (Transact-SQL)

  •