开发者社区> 问答> 正文

com.alibaba.otter.canal.protocol.CanalEntry.RowCha

使用docker部署的mysql,binlog模式也设置成了ROW,为什么com.alibaba.otter.canal.protocol.CanalEntry.RowChange#getIsDdl这个方法一直返回的true呀?

原提问者GitHub用户qianniaoliu

展开
收起
Java工程师 2023-05-03 10:57:07 468 0
2 条回答
写回答
取消 提交回答
  • 在 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 事件中的行数据,从而导致数据同步出错。

    2023-05-14 08:11:06
    赞同 展开评论 打赏
  • 多看一下wiki里的FAQ

    原回答者GitHub用户agapple

    2023-05-04 15:03:15
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载