症状
在 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不为空
从订阅者DB.dbo.MSmerge_genhistory中选择前20名,其中一代>=按代sentgen_value顺序查询的输出应类似于以下内容:
-
第一行中的生成列中的值略大于上一个查询中的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 发布