canal的坑:CanalParseException: column size is not match for table
canal
alibaba/canal: Canal 是由阿里巴巴开源的分布式数据库同步系统,主要用于实现MySQL数据库的日志解析和实时增量数据订阅与消费,广泛应用于数据库变更消息的捕获、数据迁移、缓存更新等场景。
项目地址:https://gitcode.com/gh_mirrors/ca/canal
免费下载资源
·
解析线程阻塞问题
这个基本是每个使用Canal的开发者的必踩之坑。$CANAL_HOME/conf/canal.properties配置文件中存在一行注释掉的配置:canal.instance.parser.parallelThreadSize = 16。该配置用于指定解析器实例并发线程数,如果注释了会导致解析线程阻塞,得到的结果就是什么都不会发生。
注释解除即可,建议使用默认值16。
表结构缓存异常阻塞问题
这是Issue里面很大部分提问者提到但是久未解决的问题,也就是表结构元数据的存储问题(配置项里面使用了tsdb也就是时序数据库的字眼,下面就称为tsdb功能)。
默认开启tsdb功能,也就是会通过h2数据库缓存解析的表结构,但是实际情况下,如果上游变更了表结构,h2数据库对应的缓存是不会更新的,这个时候一般会出现神奇的解析异常,异常的信息一般如下:
Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: column size is not match for table:数据库名称.表名称,新表结构的字段数量 vs 缓存表结构的字段数量;
该异常还会导致一个可怕的后果:解析线程被阻塞,也就是binlog事件不会再接收和解析。这个问题笔者也查看过很多Issue,大家都认为是一个严重的BUG,目前认为比较可行的解决方案是:禁用tsdb功能(真的够粗暴),也就是canal.instance.tsdb.enable设置为false。如果不禁用tsdb功能,一旦出现了该问题,必须要先停止Canal服务,接着删除$CANAL_HOME/conf/目标数据库实例标识/h2.mv.db文件,然后启动Canal服务。
我的解决方式是直接关闭了tsdb
GitHub 加速计划 / ca / canal
28.22 K
7.57 K
下载
alibaba/canal: Canal 是由阿里巴巴开源的分布式数据库同步系统,主要用于实现MySQL数据库的日志解析和实时增量数据订阅与消费,广泛应用于数据库变更消息的捕获、数据迁移、缓存更新等场景。
最近提交(Master分支:3 个月前 )
1e5b8a20 - 2 个月前
ff82fd65
2 个月前
更多推荐
已为社区贡献1条内容
所有评论(0)