Debezium MySQL连接器配置Filter时报错op不是有效字段如何解决
问题根因
报错由两个核心配置问题导致:
- 你开启了
include.schema.changes=true,Debezium会生成Schema变更(DDL)事件,这类事件结构仅包含source、databaseName、ddl等字段,不存在数据行变更事件才有的op、before、after字段,过滤规则作用到这类事件时直接触发字段不存在异常。 - 转换器执行顺序存在逻辑问题:你配置的
transforms执行顺序为filter, unwrap,也就是先执行过滤逻辑,再执行ExtractNewRecordState解包操作,若后续需要基于解包后的字段做过滤也会出现字段匹配错误。
解决方案
可根据你的业务需求选择任意一种方案:
方案1:关闭Schema变更同步(无需同步DDL时推荐)
直接修改配置,关闭Schema变更事件生成,过滤规则只会作用于带op字段的普通数据行变更事件:
"include.schema.changes": "false"
方案2:修改过滤规则兼容Schema变更事件(需保留DDL同步时使用)
在过滤规则开头增加非空判断,跳过无op字段的事件即可,修改后的过滤条件如下:
value.op != null && value.source.table == 'table-name' && (value.op == 'd' || value.op == 'c' || (value.op == 'u' && value.after.status != value.before.status))
方案3:调整转换器执行顺序(过滤逻辑需基于解包后消息时使用)
如果你的业务需要先解包消息再做过滤,调整transforms的执行顺序,同步修改过滤规则适配解包后的消息结构即可:
"transforms": "unwrap, filter"
注:
ExtractNewRecordState解包后op字段会默认放到消息Header中,过滤条件需对应调整取值路径。
内容的提问来源于stack exchange,提问作者Tom Carmi
相关产品推荐
相关产品推荐

