Microsoft 在一个可下载的文件中分发 Microsoft SQL Server 2008 R2 Service Pack 1 (SP1) 或 Microsoft SQL Server 2012 修补程序。 由于修补程序是累积的,因此每个新版本都包含前一个 SQL Server 2008 R2 Service Pack 1 (SP1) 或 Microsoft SQL Server 2012 更新版本中包含的所有修补程序和安全更新。
症状
请考虑以下情形:
- 在 Microsoft SQL Server 2008 R2 或 Microsoft SQL Server 2012 中基于一个数据库创建至少两个事务复制发布。
- 每个出版物至少有一篇文章。 文章不重叠,每篇文章只属于一个出版物。
- 您将发布的属性设置为 @sync\_method “并发”。
- 您将发布的属性设置为 @immediate\_sync True。
- 您将日志读取器代理的 MaxCmdsInTran 参数设置为非零值。
- 其中一个发布在一个事务中接收多个插入。
- 提交事务后,日志读取器代理开始根据 MaxCmdsInTran 参数处理和拆分事务。
- 在日志读取器代理完成任务之前,另一个发布上的快照代理将启动。
在此方案中,日志读取器代理出现故障,你会收到以下错误消息:
注意
该进程无法在“server\instance”上执行“sp_MSadd_replcmds”。
(源:MSSQLServer,错误号:1007)
无法在对象 'dbo 中插入重复键行。MSrepl_commands“,具有唯一索引”ucMSrepl_commands“。
(源:MSSQLServer,错误号:1007)
解决方法
累积更新信息
SQL Server 2012
此问题的修补程序首次在 SQL Server 2012 的累积更新 1 中发布。 有关此累积更新包的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2679368 SQL Server 2012 累积更新包 1 注意 由于版本是累积的,因此每个新的修补程序版本都包含之前 SQL Server 2012 修补程序版本中包含的所有修补程序和所有安全修补程序。 Microsoft 建议考虑应用包含此修补程序的最新修补程序版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2692828 SQL Server 2012 发布之后发布的 SQL Server 2012 内部版本 必须将 SQL Server 2012 修补程序应用于 SQL Server 2012 的安装。
SQL Server 2008 R2 SP1 累积更新程序包 4
此问题的修补程序已在累积更新 4 中首次发布。 有关如何获取 SQL Server 2008 R2 SP1 的此累积更新程序包的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2633146 SQL Server 2008 R2 SP1 累积更新程序包 4 注意 由于版本是累积的,因此每个新的修补程序版本都包含之前 SQL Server 2008 R2 SP1 修补程序版本中包含的所有修补程序和安全修补程序。 建议应用包含此修补程序的最新修补程序版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2567616 在 SQL Server 2008 R2 SP1 发布之后发布SQL Server 2008 R2 内部版本
解决方法
若要解决此问题,请使用以下某种方法:
- 不要将 @sync\_method 发布的属性设置为“并发”,也不要将 @immediate\_sync 发布的属性设置为“true”。
- 将 MaxCmdsInTran 参数的值设置为零。
状态
Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。