KB2733630 - 在 SQL Server 中的合并复制同步期间,合并代理可能会失败

应用对象
SQL Server 2008 Developer SQL Server 2008 Enterprise SQL Server 2008 Express SQL Server 2008 R2 Datacenter SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Express SQL Server 2008 R2 Parallel Data Warehouse SQL Server 2008 R2 Standard SQL Server 2008 R2 Web SQL Server 2008 R2 Workgroup SQL Server 2008 Standard SQL Server 2008 Web SQL Server 2008 Workgroup SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Enterprise Core SQL Server 2012 Express SQL Server 2012 Standard SQL Server 2012 Web SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Express - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2014 Web - duplicate (do not use)

症状

在 Microsoft SQL Server 2008 及更高版本的 SQL Server 中同步合并复制期间,合并代理可能会失败。 此外,你还会收到以下错误消息:

注意

检测到基于保留的元数据清理在订阅服务器上删除了尚未发送到发布服务器的更改的元数据后,合并代理失败。 必须在不上传) 的情况下重新初始化订阅 (。 (源:MSSQL_REPL,错误号:MSSQL_REPL-2147199401)

获取帮助:http://help/MSSQL_REPL-2147199401

出现此问题的原因可能有多种。 其中包括某些情况下预期的许多原因。 若要确定是否意外遇到此错误,请检查“原因”部分中所述的元数据详细信息。

原因

此问题的原因可以在订阅服务器上的以下系统表中找到:

  • dbo.sysMergeSubscriptions
  • Dbo。MsMerge_Genhistory

确保合并代理不再同步。 然后,运行以下查询并检查结果:

从 SubscriberDB.dbo.sysMergeSubscriptions 中选择 sentgen,其中 pubid = subid 且 sentgen 不为 null

查询结果

sentgen 列标记订阅服务器发送给发布者的最早更改组。 如果返回多个值,请检查 dbo.sysMergeSubscriptions 表中的其他列,以确保查看正确发布的元数据。 接下来,使用以下查询中此查询返回的值:

从SubscriberDB.dbo.MSmerge_genhistory选择前 20 * ,其中 generation >= 按代sentgen_value 顺序查询的输出应如下所示:

按代查询结果

如果满足以下所有条件,则可能会遇到意外错误:

  • 第一行的 生成 列中的值略大于上一个查询中的 sentgen 值。
  • genstatus 列中的值为 4
  • changecount 列中的值为 0

注意 第一行的 coldate 列的值通常也比其他行中该列的值要早得多。

解决方法

若要解决此问题,请重新初始化生成错误的订阅服务器。

在某些情况下,无需完全重新初始化即可解决此问题。 若要了解可能的解决方法,请联系 Microsoft 客户支持服务。

若要防止将来出现此问题,请根据SQL Server的版本应用以下修复程序之一。

累积更新信息

SQL Server 2008

SQL Server 2008 中没有此问题的修补程序。

SQL Server 2008 R2 Service Pack 2

此问题的修补程序首次在累积更新 3 中发布。 有关如何为 SQL Server 2008 R2 Service Pack 2 获取此累积更新包的详细信息,请单击以下序列号以查看Microsoft知识库中的文章:

2754552 SQL Server 2008 R2 Service Pack 2 的累积更新包 3
 注意 由于内部版本是累积的,因此每个新修补程序版本都包含上一个SQL Server 2008 R2 Service Pack 2 修补程序版本中包含的所有修补程序和所有安全修补程序。 建议考虑应用包含此修补程序的最新修补程序版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2730301 SQL Server 2008 R2 Service Pack 2 发布后发布的 SQL Server 2008 R2 版本

SQL Server 2012

此问题的修补程序首次在累积更新 4 中发布。 有关如何为 SQL Server 2012 获取此累积更新包的详细信息,请单击以下编号以查看Microsoft知识库中的文章:

2758687 2012 SQL Server 累积更新包 4
 注意 由于内部版本是累积的,因此每个新修补程序版本都包含所有修补程序和以前的 SQL Server 2012 修补程序版本中包含的所有安全修补程序。 建议考虑应用包含此修补程序的最新修补程序版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2692828 SQL Server 2012 年发布后发布的SQL Server 2012 版本

SQL Server 2008 R2 Service Pack 1

此问题的修补程序首次在累积更新 8 中发布。 有关如何获取 SQL Server 2008 R2 Service Pack 1 的此累积更新包的详细信息,请单击以下序列号以查看Microsoft知识库中的文章:

2723743 SQL Server 2008 R2 SP1 的累积更新包 8 注意 由于内部版本是累积的,因此每个新修补程序版本都包含以前的SQL Server 2008 R2 Service Pack 1 修补程序版本中包含的所有修补程序和所有安全修补程序。 建议考虑应用包含此修补程序的最新修补程序版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2567616 SQL Server 2008 R2 SP1 发布后发布的 SQL Server 2008 R2 版本