KB2648158 - 修复:在 SQL Server 2008 R2 或 SQL Server 2012 中,在日志读取器代理的 MaxCmdsInTran 参数中设置非零值时,出现错误消息“进程无法执行”

应用对象
SQL Server 2008 R2 Service Pack 1

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 产品中存在问题。