KB4039089 - 修复:在 SQL Server 中执行sys.sp_MScdc_capture_job存储过程时出现EXCEPTION_ACCESS_VIOLATION错误

应用对象
SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2016 Service Pack 1 SQL Server 2017 on Windows (all editions) SQL Server 2017 on Linux (all editions) 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 Standard - duplicate (do not use)

症状

请考虑以下情形:

  • 假设已在 Microsoft SQL Server中分区表,它们是更改数据记录 (CDC) 或事务复制的一部分。 从这些表切换或切换分区。
  • 执行数据操作语言 (DML) 操作时,分区切换后,可能会注意到发生 EXCEPTION_ACCESS_VIOLATION 并生成内存转储文件。

注意

日期/时间 ***正在发送到 FilePath\FileName 的堆栈转储
日期/时间 SqlDumpExceptionHandler: ProcessID EXCEPTION_ACCESS_VIOLATION生成了致命异常 c0000005。 SQL Server正在终止此过程。
日期/时间 * *******************************************************************************
日期/时间
日期/时间 * BEGIN STACK DUMP:
日期/时间
日期/时间
日期/时间 *
日期/时间
日期/时间 * 异常地址 = 000007FEE724BD80 模块 (sqllang+00000000015BBD80)
日期/时间 * 异常代码 = c0000005 EXCEPTION_ACCESS_VIOLATION
日期/时间 * 读取地址000000000000002A发生访问冲突
日期/时间 * 输入缓冲区 70 字节
日期/时间 * sys.sp_MScdc_capture_job
日期/时间 *

注意

日期/时间 ***正在发送到 FilePath\FileName 的堆栈转储
日期/时间 SqlDumpExceptionHandler:进程 PID 生成了致命异常 c0000005 EXCEPTION_ACCESS_VIOLATION。 SQL Server正在终止此过程。
日期/时间 * *******************************************************************************
日期/时间 *
日期/时间 * BEGIN STACK DUMP:
日期/时间 * 日期/时间PID
日期/时间 *
日期/时间 *
日期/时间 * 异常地址 = 000007FEE9D26640 模块 (sqllang+0000000001586640)
日期/时间 * 异常代码 = c0000005 EXCEPTION_ACCESS_VIOLATION
日期/时间 * 读取地址000000000000002A发生访问冲突
日期/时间 * 输入缓冲区 109 字节 -
日期/时间 * 16 00 00 00 12 00 00 00 02 00 00 00 00 00 00 00 00
日期/时间 * s p _ r e p 01 00 00 00 0b 00 73 00 70 00 5f 00 72 00 65 00 70 00
日期/时间 * l c m d s & ô 6c 00 63 00 6d 00 64 00 73 00 00 00 00 26 04 04 f4
日期/时间 * & & ÿ 01 00 00 00 00 26 04 00 00 00 00 00 00 26 04 04 ff
日期/时间 * ÿÿ¥ ¥& ff ff ff 00 00 a5 0a 00 00 00 00 00 26 04 04 8f 13 00
日期/时间 * & & 00 00 00 26 04 04 00 00 00 00 00 00 00 26 04 04 20 a1 07
日期/时间 * 00

  • 如果针对目标表运行以下查询,你可能会注意到 ,对于 不正确的非聚集索引,is_replicated列的值将被标记为“1”。

select index_id, partition_number,* from sys.system_internals_partition_columns pc with(nolock)

JOIN sys.partitions p with(nolock)

ON p.partition_id = pc.partition_id

where p.object_id = object_id ('PartitionTable')

order by 2

解决方法

以下SQL Server累积更新中修复了此问题:

2017 SQL Server累积更新 1

SQL Server 2016 SP1 的累积更新 5

SQL Server 2014 SP2 的累积更新 8

关于SQL Server的累积更新:

SQL Server的每个新累积更新都包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 查看SQL Server的最新累积更新:

SQL Server 2017 的最新累计更新

SQL Server 2016 年的最新累积更新

SQL Server 2014 年的最新累积更新

状态

Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。

参考资料

了解 Microsoft 用于描述软件更新的术语