环境:
- canal版本:1.1.6
- 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上拉取源码查看报错位置:
再查看case中的值都有哪些
发现没有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协议版本存在差异,也可能会导致此类问题。
解决方案
-
升级Canal:首先检查是否有更新版本的Canal发布,新版本可能已经修复了对新binlog事件的支持。确保Canal版本与MySQL版本兼容。
-
配置Binlog格式:
- 确保MySQL的binlog格式设置为
ROW模式,因为Canal依赖于这种模式来捕获数据变更。 - 您还可以考虑将
binlog_row_image设置为FULL以确保所有列信息都包含在binlog中。
- 确保MySQL的binlog格式设置为
-
跳过有问题的事件:如果上述方法不可行,您可以尝试通过配置Canal忽略某些类型的事件,但这通常不是推荐的做法,因为它可能导致数据同步丢失。
-
修改源代码:作为最后的选择,如果问题是由于Canal内部对
TABLE_MAP_EVENT的处理不当引起的,您可以尝试自己修正这个问题并构建Canal。不过,这需要一定的开发能力和对Canal源码的理解。 -
社区和支持:如果您无法自行解决问题,建议查阅Canal项目的官方文档或访问相关的开发者社区寻求帮助。此外,阿里云提供技术支持服务,如果您是付费用户,可以直接联系他们的客服获取帮助。
-
检查MySQL版本和配置:确认MySQL的版本是否与Canal兼容,有时升级MySQL也会引发类似的问题。查看MySQL的日志文件,确保没有其他潜在的问题影响binlog的正常工作。