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

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

适用范围:SQL Server
原始 KB 数: 4538384

现象

假设出现了下面这种情景:

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

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

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

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

错误:913,严重性:16,状态:16。 找不到数据库 IDID。 可能该数据库尚未激活,也可能正处于转换过程中。 一旦数据库可用,请重新发出查询。 如果认为此错误是由于正在转换其状态的数据库而导致的,并且此错误将继续发生。

详细信息

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

解决方法

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

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

  • 确保对具有几何图形、地理或 hierarchyid 数据类型的表进行 DDL 更改时,不会进行任何内检 DML 更改。 若要避免此问题,请执行以下步骤:

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

    注意

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