当处理具有系统 CLR 数据类型的表的更改时,CDC 捕获作业失败, (geometry、geography 或 hierarchyid)

本文可帮助你解决以下问题:在处理具有系统 CLR 数据类型 (几何图形、geography 或 hierarchyid) 的表的更改时,CDC 捕获作业失败。

适用于: SQL Server
原始 KB 编号: 4538384

症状

请考虑以下情况:

  • 在具有系统 CLR 数据类型(如 geometry、geography 或 hierarchyid)的表上启用更改数据捕获 (CDC) 功能。
  • CDC 捕获 (扫描) 作业正在处理与其他表相关的更改。 进程尚未到达具有系统 CLR 数据类型的表。
  • 对具有系统 CLR 数据类型的表进行一些数据操作语言 (DML) 更改。 然后,对同一 (个表) 数据定义语言 (DDL) 更改,例如添加列) 。

在这种情况下,当 CDC 捕获作业开始处理具有系统 CLR 数据类型的表时,它将失败并返回以下错误消息:

Msg 18805,级别 16,状态 1,过程sp_replcmds,LineLineNumber[Batch Start LineNumber ]
Log-Scan 进程无法从日志序列号 (LSN) {nnnnnnnn: nnnnnnnn: nnnnnn} 构造复制的命令。 备份发布数据库并联系客户支持服务。
消息 22859,级别 16,状态 2,过程sp_replcmds,行编号 [Batch 起始行编号 ]
日志扫描进程在处理日志记录时失败。 请参阅当前会话中的先前错误,以确定原因并更正任何相关问题。
消息 3621,级别 16,状态 6,过程sp_replcmds,行编号 [Batch 起始行编号 ]
该语句已终止。
Msg 22864,级别 16,状态 1,过程sp_MScdc_capture_job,LineNumber[Batch Start LineNumber ]
数据库“DatabaseName”的捕获作业对sp_MScdc_capture_job的调用失败。 查看以前的错误,了解失败的原因。

此外,可能会在错误日志中记录以下条目:

错误:913,严重性:16,状态:16。 找不到数据库 IDID。 数据库可能尚未激活,或者可能正在转换中。 数据库可用后,重新发出查询。 如果认为此错误不是由于数据库正在转换其状态而此错误继续发生。

更多信息

如果 CDC 捕获作业最初只处理 DML,然后在下次运行时处理 DDL 更改,则不会出现此问题。

解决方法

若要解决此问题,请尝试以下方法之一:

  • 避免将有问题的数据类型 (几何图形、geography、hierarchyid) 与 CDC 一起使用。

  • 在对具有几何图形、geography 或 hierarchyid 数据类型的表进行 DDL 更改时,请确保没有正在进行的 DML 更改。 若要避免此问题,请执行以下步骤:

    1. 将所有 DML 停到表。
    2. 运行捕获作业以处理更改。
    3. 为表运行 DDL。
    4. 运行捕获作业以处理 DDL 更改。
    5. 重新启用 DML 处理。

    注意

    如果继续遇到此问题,请在表上禁用并重新启用 CDC。