线上canal问题排查:CanalParseException: column size is not match,parse row data failed

一、背景现象

背景:公司flink任务出现问题,数据没有写入到结果库中。

于是立马去查看flink任务,在web页面,没有任何异常,没有exception,checkpoint也正常,反压也没有。
那问题就不出在我程序的问题上了。矛头直指环境问题

二、环境排查

首先去查看了flink的taskManager打印的日志,发现数据消费到了某一个时间段,后续就再也没有数据进来了。
说明数据没有到flink程序,所以源头就出了问题。
检查了一下 kafka,发现没有消息积压,而且消费速率也正常。
那么问题也不出在kafka。那么就只可能是出在更源头的地方:canal

三、祸首canal

运维大佬查了一下canal日志:

com.alibaba.otter.canal.parse.exception.CanalParseException: com.alibaba.otter.canal.parse.exception.CanalParseException: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed.
Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed.
Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed.
Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: column size is not match for table:xxxx.xxx,22 vs 21

很明显,这日志就说 数据库新增了一个字段,跟之前的数据库字段个数不一致了。导致canal出错,然后消息没发出去

当时就想 canal肯定能支持兼容DDL撒,那肯定是canal某个设置的问题。
然后就去github找了一下canal的文档。
然后搜索的时候果然搜索到了某条issue,里面的内容大概跟我相似
重点指向:

 canal.instance.filter.query.ddl = true 

这个配置 从语义上讲,很明显看出来就是canal过滤掉了 mysql的ddl语句,那么就自然无法感知 mysql新增了一个字段。这样的话 当新增字段之后新来了一条数据,那么canal无法匹配字段个数,就报错了。

解决方案

canal.instance.filter.query.ddl = false

这样就可以了,canal就能接收到ddl语句,能自己去适应新增字段之后的变更了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值