canal icon indicating copy to clipboard operation
canal copied to clipboard

tsdb保存的表结构缺少字段,tsdb中结构和实际上游的表结构不一致

Open gunagyu001 opened this issue 5 years ago • 8 comments

几周前发现canal-server的日志中有报错: Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: column size is not match for table:boxonline.order,46 vs 43

然后我去校验原表,和我同步到下游的表结构,发现两个表结构一致,都是46个字段;

但是当我查看canal_tsdb.meta_history表时发现,表中sql_text字段的建表语句中只有43个字段,和上下游两张表的建表语句比较了下,确实少了三个字段的信息;

接下来我尝试清空canal的meta_history,meta_snapshot两张表,删除zk中保存的cusor信息,修改instance文件中偏移量到最新的位置,然后重新启动canal-server,又可以继续同步数据了,但过了1天左右再次报错: column size is not match for table:boxonline.order,46 vs 43;

再次尝试上述的方式,重新启动了;

这个问题发生了好几次,而且永远只会在这张表发生,其他的表没有出现过这个错误,目前已经停止同步了,还没有解决,请指点下是什么原因导致的?

tsdb中表结构是从哪里拿到的呢(是binlog中的table_map_event吗,我看到canal的原始日志里面mysql_type信息是正确的)?

有哪些原因会导致tsdb缺少字段的问题?

这种问题我该如何处理?

PS: 上游的MySQL版本是阿里云rds-MySQL8

下游版本为阿里云rds-MySQL5.7

canal版本1.1.4

gunagyu001 avatar May 27 '20 09:05 gunagyu001

执行了CREATE IF NOT EXIST xxx_table 这样的SQL,会更新tsdb缓存和持久化MySQL中的数据;但是在执行CREATE IF NOT EXIST xxx_table 这样的SQL时如果已经存在的表结构并不会去创建新的表,所以这个时候更新了tsdb就会把错误的表结构更新到tsdb;

tsywkGo avatar May 27 '20 11:05 tsywkGo

我想到的解决方案:遇到CREATE IF NOT EXIST xxx_table 这样的SQL时,先去检查tsdb中是否存在,如果存在就不需要去更新tsdb;如果不存在去被同步的数据库上show create table xxx_table查看是否存在,如果存在,则不去更新tsdb,因为tsdb会异步加载不存在的表结构;如果不存在则去更新tsdb;前提条件是在这个时间节点内不存在drop table这样的SQL。 @agapple

tsywkGo avatar May 27 '20 11:05 tsywkGo

@gunagyu001 请问这个问题你解决了吗?我也遇到这个问题了,昨天删除“conf/实例名/meta.dat” 文件之后重启,今天又报了这个错...

LiuPengKun1993 avatar Jul 28 '20 05:07 LiuPengKun1993

在instances.properties把tsdb功能关掉,tsdb.enable设置为false,这个问题我是这样解决了的

------------------ 原始邮件 ------------------ 发件人: "alibaba/canal" <[email protected]>; 发送时间: 2020年7月28日(星期二) 中午1:51 收件人: "alibaba/canal"<[email protected]>; 抄送: "侠客"<[email protected]>;"Mention"<[email protected]>; 主题: Re: [alibaba/canal] tsdb保存的表结构缺少字段,tsdb中结构和实际上游的表结构不一致 (#2772)

@gunagyu001 请问这个问题你解决了吗?我也遇到这个问题了,昨天删除“conf/实例名/meta.dat” 文件之后重启,今天又报了这个错...

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

gunagyu001 avatar Jul 28 '20 06:07 gunagyu001

在instances.properties把tsdb功能关掉,tsdb.enable设置为false,这个问题我是这样解决了的

好的多谢

LiuPengKun1993 avatar Jul 28 '20 07:07 LiuPengKun1993

@yuanweikang2020 create table IF NOT EXIST的确是一个隐患,考虑修复下

agapple avatar Aug 21 '20 02:08 agapple

@yuanweikang2020 create table IF NOT EXIST的确是一个隐患,考虑修复下

您好,请问已经修复了嘛

HaoWenQiang avatar Nov 02 '20 08:11 HaoWenQiang

@yuanweikang2020 create table IF NOT EXIST的确是一个隐患,考虑修复下

您好,请问已经修复了吗?

dmanbu avatar Dec 30 '24 01:12 dmanbu