You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Debezium捕获SQL Server插入记录时全为op:'r'的问题解决求助

问题解决:Debezium捕获SQL Server CDC时所有记录op均为'r'的处理方案

问题根源分析

  1. 初始快照行为:当配置snapshot.mode: initial时,Debezium会先全量读取表中现有数据,这些快照记录的op字段固定为r(代表read),属于正常的全量同步行为。
  2. 配置参数冲突:skipped.operations: u,d,r的意图是跳过更新、删除、快照读取操作,但如果快照已在运行,该参数无法回溯过滤已生成的快照记录;同时若增量CDC的op仍为r,则说明Debezium未正确解析SQL Server CDC的变更标记。
  3. 转换逻辑验证:ExtractNewRecordState转换虽配置了add.fields: op,但需确认Debezium是否正确将SQL Server CDC的$operation字段映射为op:
    • SQL Server CDC中$operation=2对应insert(Debezium的op=c)
    • $operation=3/4对应update(op=u)
    • $operation=1对应delete(op=d)

分步解决方案

1. 调整快照模式(按需选择)

如果仅需要增量插入记录,无需全量同步现有数据,修改快照模式:

"snapshot.mode": "schema_only"

该配置仅同步表结构,不会生成全量快照的r型记录。若需保留全量同步,后续需通过过滤规则剔除op=r的记录。

2. 修正操作过滤配置

确保仅保留插入操作,调整skipped.operations:

"skipped.operations": "u,d,r"

此配置会跳过更新、删除、快照读取操作,仅保留增量插入的c型记录。

3. 验证原始CDC数据映射

先临时移除ExtractNewRecordState转换,查看Debezium原始输出结构,确认op字段是否正确:

{
  "before": null,
  "after": { /* 插入的数据 */ },
  "source": { /* 源信息 */ },
  "op": "c",
  "ts_ms": 1234567890
}
  • 若原始记录op为c,说明问题出在转换阶段;
  • 若原始记录op仍为r,需检查:
    • 目标表是否已正确启用SQL Server CDC
    • Debezium数据库用户是否拥有cdc_admin或db_owner角色权限
    • SQL Server的cdc.<数据库名>_capture作业是否正常运行

4. 添加插入记录过滤转换

保留ExtractNewRecordState转换的同时,新增过滤规则仅保留插入记录:

"transforms": "unwrap,filterInsert",
"transforms.unwrap.type": "io.debezium.transforms.ExtractNewRecordState",
"transforms.unwrap.add.fields": "op",
"transforms.filterInsert.type": "org.apache.kafka.connect.transforms.Filter$Value",
"transforms.filterInsert.condition": "$.__op == 'c'"

5. 重启连接器验证

修改配置后重启Debezium连接器,插入测试数据,检查输出记录的__op是否为c。若仍有问题,查看连接器日志,排查权限、CDC作业状态等异常。

内容的提问来源于stack exchange,提问作者Murat Dinc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:55:33