Debezium捕获SQL Server插入记录时全为op:'r'的问题解决求助
问题解决:Debezium捕获SQL Server CDC时所有记录op均为'r'的处理方案
问题根源分析
- 初始快照行为:当配置
snapshot.mode: initial时,Debezium会先全量读取表中现有数据,这些快照记录的op字段固定为r(代表read),属于正常的全量同步行为。 - 配置参数冲突:
skipped.operations: u,d,r的意图是跳过更新、删除、快照读取操作,但如果快照已在运行,该参数无法回溯过滤已生成的快照记录;同时若增量CDC的op仍为r,则说明Debezium未正确解析SQL Server CDC的变更标记。 - 转换逻辑验证: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)
- SQL Server CDC中
分步解决方案
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
相关产品推荐
相关产品推荐

