canal同步报错:Duplicate column name ‘name2‘

一 问题描述

我们canal有个这样的使用场景:

从多个源端同步相同的表数据到同一个目标端进行数据的统一展示。

但是发现在源端1添加字段的时候,目标端能正常增加字段。但是在其他源端添加该字段,这时canal client日志会报错:

ERROR c.a.otter.canal.adapter.launcher.loader.AdapterProcessor - java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Duplicate column name 'name2'

此后,在源端1之外的其他源端往新增的这个字段插入的数据,无法同步到目标端,其他字段的数据能正常同步。

二 解决办法

尽量避免执行加字段的操作,如果实在需要加字段,需要严格按照如下方法操作,只是需要对表加锁,会影响业务,连正常的select都会被阻塞,如果是大表,影响业务时间较长。若操作不慎,会导致数据丢失。

方法一

在第一个源端正常加字段即可。

在其他源端加字段时按照如下步骤进行:

① 锁表,禁止写入数据,防止变更期间(下面加字段与修改表结构之间新增的sql变更)的canal同步数据丢失,但是加锁影响范围很大,其他会话连select查询都会被阻塞。

LOCK TABLE t11  WRITE;  

② 执行加字段的sql变更

ALTER TABLE t11 ADD name2 VARCHAR(30);

手动修改源端该表表结构,使得canal能同步后续sql变更。

#只改下新加字段的长度即可,长度和之前保持一致,该操作对源端表结构无影响,但发现可触发canal同步。

ALTER TABLE t11 MODIFY name2 VARCHAR(30);

④ 解锁

UNLOCK TABLES;

方法二

发现重启canal client后,新插入的数据能同步过来,只是在源端加字段与重启canal client之间新插入的数据无法进行同步。为了确保这中间新增的数据能正常同步,需要在其他源端添加字段前先锁表。

操作步骤:

① 在源端1正常添加字段即可。

② 在其他源端添加字段前先锁表,禁止数据写入,防止数据丢失

LOCK TABLE t31  WRITE

③ 在其他源端执行加字段的变更;

重启其他源端的canal client

⑤ 在其他源端解锁:

UNLOCK TABLES;

猜你喜欢

转载自blog.csdn.net/yabignshi/article/details/120304730