Applies ToSQL 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

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

从订阅者DB.dbo.sysMerge订阅中选择sentgen,其中pubid = subid和sentgen不为空 Query results sentgen列标记订阅者发送给发布者的最旧的更改组。如果返回多个值,请检查 dbo.sysMergeSubscriptions 表中的其他列,以确保查看正确发布的元数据。接下来,使用此查询在以下查询中返回的值:

从订阅者DB.dbo.MSmerge_genhistory中选择前20名,其中一代>=按代sentgen_value顺序查询的输出应类似于以下内容: Query result by generation 当以下所有条件都为 true 时,您可能会意外地遇到错误:

  • 第一行中的生成列中的值略大于上一个查询中的sentgen值。

  • genstatus列中的值为4。

  • 更改计数列中的值为0。

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

解决方案

要解决此问题,重新初始化产生错误的订阅者。在某些情况下,您可能能够在完全重新初始化的情况下解决此问题。有关可能的解决方法的信息,请与 Microsoft 客户支持服务联系。为防止将来出现此问题,请应用以下修补程序之一,具体取决于 SQL Server 的版本。

累积更新信息

SQL Server 2008

SQL Server 2008 中没有此问题的修复方法。

SQL 服务器 2008 R2 服务包 2

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

2754552 SQL Server 2008 R2 服务包 2 的累积更新包 3备注由于生成是累积的,因此每个新修补程序版本都包含以前的 SQL Server 2008 R2 服务包 2 修复版本中包含的所有修补程序和所有安全修补程序。我们建议您考虑应用包含此修补程序的最新修复版本。有关详细信息,请单击以下文章编号以查看 Microsoft 知识库中的文章:

2730301 SQL Server 2008 R2 版本发布后 SQL Server 2008 R2 服务包 2 发布

SQL Server 2012

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

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

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

SQL 服务器 2008 R2 服务包 1

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

2723743 SQL Server 2008 R2 SP1 的累积更新包 8备注由于生成是累积的,因此每个新修补程序版本都包含以前的 SQL Server 2008 R2 服务包 1 修复版本中包含的所有修补程序和所有安全修补程序。我们建议您考虑应用包含此修补程序的最新修复版本。有关详细信息,请单击以下文章编号以查看 Microsoft 知识库中的文章:

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

需要更多帮助?

需要更多选项?

了解订阅权益、浏览培训课程、了解如何保护设备等。