Debezium New Record State Extraction SMT处理DELETE操作异常问题
问题原因
你遇到的非主键字段为空现象是ExtractNewRecordState SMT的默认行为导致的:
- 当
delete.handling.mode设为rewrite时,默认情况下SMT会优先取事件的after块内容填充payload - DELETE事件本身不存在
after块,只有before块存储删除前的记录内容,默认配置下仅会把主键字段从before块拷贝到payload里,其余非主键字段都会留空,所以你会看到id有值,first_name、last_name为空。
解决方案
在你现有的SMT配置中新增一行配置即可:
"transforms.unwrap.delete.use.before": "true"
修改后的完整配置如下:
"transforms": "unwrap", "transforms.unwrap.type": "io.debezium.transforms.ExtractNewRecordState", "transforms.unwrap.drop.tombstones": true, "transforms.unwrap.delete.handling.mode": "rewrite", "transforms.unwrap.delete.use.before": "true", "transforms.unwrap.add.fields": "db,schema,table,txId,ts_ms"
开启该配置后,DELETE事件的payload会直接使用before块的全量字段值填充,你就能拿到删除时刻first_name、last_name的原始值,同时原有的__deleted标记等附加字段也会正常保留。
注意事项
delete.use.before配置从Debezium 1.9版本开始支持,如果你使用的版本低于1.9,需要先升级Debezium到1.9及以上版本,或者自定义SMT实现相同逻辑。
内容的提问来源于stack exchange,提问作者Suren Aznauryan
相关产品推荐
相关产品推荐

