canal实例报错:java.lang.IllegalArgumentException: unknow type : 23

247 阅读2分钟

环境:

  1. canal版本:1.1.6
  2. mysql版本为:8.0

以下为canal实例报错:

caused by  
com.alibaba.otter.canal.parse.exception.CanalParseException: java.lang.IllegalArgumentException: unknow type : 23  
Caused by: java.lang.IllegalArgumentException: unknow type : 23  
at com.taobao.tddl.dbsync.binlog.event.TableMapLogEvent.<init>(TableMapLogEvent.java:504) ~[canal.parse.dbsync-1.1.6.jar:na]  
at com.taobao.tddl.dbsync.binlog.LogDecoder.decode(LogDecoder.java:151) ~[canal.parse.dbsync-1.1.6.jar:na]  
at com.taobao.tddl.dbsync.binlog.LogDecoder.decode(LogDecoder.java:80) ~[canal.parse.dbsync-1.1.6.jar:na]  
at com.alibaba.otter.canal.parse.inbound.mysql.MysqlMultiStageCoprocessor$SimpleParserStage.onEvent(MysqlMultiStageCoprocessor.java:269) ~[canal.parse-1.1.6.jar:na]  
at com.alibaba.otter.canal.parse.inbound.mysql.MysqlMultiStageCoprocessor$SimpleParserStage.onEvent(MysqlMultiStageCoprocessor.java:251) ~[canal.parse-1.1.6.jar:na]  
at com.lmax.disruptor.BatchEventProcessor.processEvents(BatchEventProcessor.java:168) ~[disruptor-3.4.2.jar:na]  
at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:125) ~[disruptor-3.4.2.jar:na]  
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_181]  
at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_181]  
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_181]  
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_181]

从github上拉取源码查看报错位置:

image.png

再查看case中的值都有哪些

image.png

发现没有23这个类型,可能是mysql8.0中的新特性导致canal解析binlog中的类型失败。

查看部门中今天提交的sql工单,发现有对json类型字段添加索引,在测试环境删除该索引,修改canal配置中的binlog点位,重启实例后,服务正常。

以下为ai回答(凑字数)

错误分析

  • Binlog事件类型23:根据MySQL binlog文档,事件类型23对应的是TABLE_MAP_EVENT。这个事件用来映射表ID到数据库和表名,以便后续的行事件(如写入、更新或删除事件)可以引用它们。
  • Canal版本问题:您使用的Canal版本(1.1.6)可能不完全支持您的MySQL版本生成的所有类型的binlog事件,尤其是如果MySQL进行了更新或引入了新的特性。
  • 兼容性问题:如果MySQL服务器和Canal之间的MySQL协议版本存在差异,也可能会导致此类问题。

解决方案

  1. 升级Canal:首先检查是否有更新版本的Canal发布,新版本可能已经修复了对新binlog事件的支持。确保Canal版本与MySQL版本兼容。

  2. 配置Binlog格式

    • 确保MySQL的binlog格式设置为ROW模式,因为Canal依赖于这种模式来捕获数据变更。
    • 您还可以考虑将binlog_row_image设置为FULL以确保所有列信息都包含在binlog中。
  3. 跳过有问题的事件:如果上述方法不可行,您可以尝试通过配置Canal忽略某些类型的事件,但这通常不是推荐的做法,因为它可能导致数据同步丢失。

  4. 修改源代码:作为最后的选择,如果问题是由于Canal内部对TABLE_MAP_EVENT的处理不当引起的,您可以尝试自己修正这个问题并构建Canal。不过,这需要一定的开发能力和对Canal源码的理解。

  5. 社区和支持:如果您无法自行解决问题,建议查阅Canal项目的官方文档或访问相关的开发者社区寻求帮助。此外,阿里云提供技术支持服务,如果您是付费用户,可以直接联系他们的客服获取帮助。

  6. 检查MySQL版本和配置:确认MySQL的版本是否与Canal兼容,有时升级MySQL也会引发类似的问题。查看MySQL的日志文件,确保没有其他潜在的问题影响binlog的正常工作。