使用docker部署的mysql,binlog模式也设置成了ROW,为什么com.alibaba.otter.canal.protocol.CanalEntry.RowChange#getIsDdl这个方法一直返回的true呀?
原提问者GitHub用户qianniaoliu
在 MySQL 的 binlog 模式设置正确的前提下,com.alibaba.otter.canal.protocol.CanalEntry.RowChange#getIsDdl方法仍然可能返回 true 的原因可能如下:
MySQL 的 binlog 模式为 ROW,但是数据库更改的语句中并未包含 DDL (Data Definition Language)语句。因为 getIsDdl 方法返回 false 的情况仅在数据库更改的是 DML(Data Manipulation Language)语句时才会发生,若数据库更改的是 DDL 语句,则方法会返回 true。
Canal Server 的配置文件中设置了 canal.instance.filter.regex 参数(如 canal.instance.filter.regex=.\..),这个配置项会将所有的 binlog 事件均视为 DDL 事件。因此检查这个配置项是否有误。如果你不需要将所有事件都视为 DDL 事件,可以修改该配置项,例如使用 canal.instance.filter.regex=.*\.tb_name 仅过滤目标数据库中指定的表,或者将该配置项删除。
需要注意的是,在 Canal Server 中,当getIsDdl返回 true 时,会忽略com.alibaba.otter.canal.protocol.CanalEntry.RowChange#getRowDatasList()方法返回的行数据列表,而是仅处理 DDL 的元数据信息,例如表名、DDL 语句等。因此如果getIsDdl始终返回 true,可能会导致 Canal Server 无法正确处理 DML 事件中的行数据,从而导致数据同步出错。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。