记一次canal除坑记录
错误信息
Caused by :com.alibaba.otter.canal.parse.exception.CanalParseException: column size is not match for table
问题处理
今天对Canal相关程序进行升级,原监听的表及业务都正常;遇到新增加的表时总是不走;
因为我们开发的程序都记过测试环境自测,所以直接从线上canal的日志开始排查问题;
canal错误日志截图:
从错误看表字段数不对,以为时程序开很长时间了canal缓存了之前的表结构;但是canal跑了2年左右了,啥时候缓存的已经不知道了,随对canal进行重启,但是问题依旧,随针对问题进行网上检索;
找到了CanalParseException: column size is not match for table 标题和错误一致;查看和我们初步分析一致 canal缓存的表结构出现了不一致的情况;
随后依次按照文档的处理办法进行处理;
- 停止canal相关程序,和Canal服务;
- 找到conf/canal.properties 将
canal.instance.tsdb.enable
设置为false; - 删除$CANAL_HOME/conf/目标数据库实例标识/h2.mv.db文件;
- 最后启动Canal服务
启动后发现第二部的设置未达到预期,h2.mv.db
文件又生成了。
Canal服务有问题?不可能;
继续排查发现在canal.properties
有关于conf的配置:
canal.instance.tsdb.enable = false
canal.instance.tsdb.dir = ${canal.file.data.dir:../conf}/${canal.instance.destination:}
canal.instance.tsdb.url = jdbc:h2:${canal.instance.tsdb.dir}/h2;CACHE_SIZE=1000;MODE=MYSQL;
说明canal不只是加载了自己的配置,还加载了实例的配置;随查了一下实例下的instance.properties
配置也有关于canal.instance.tsdb.enable = true
;随停止Canal服务后将这个改为false;再次重启Canel服务;当问题仍旧没有解决;
问题找到了,诸多措施仍处理问题;
网络一大搜,找到了 canal读取mysql采坑大全; 是第一条就是:
删除meta.dat删除,再重启canal,问题解决;
随对实例下的meta.dat删除,重启;
问题终于解决了。
总结
问题定位到,处理问题措施需要根据自己的实际情况,各自的配置都不一样。
资料
CanalParseException: column size is not match for table
canal读取mysql采坑大全