canal同步报错:Duplicate column name ‘name2‘
Posted 雅冰石
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
以上是关于canal同步报错:Duplicate column name ‘name2‘的主要内容,如果未能解决你的问题,请参考以下文章
配canal instance同步报错:java.lang.ArrayIndexOutOfBoundsException: 1
配canal instance同步报错:java.lang.ArrayIndexOutOfBoundsException: 1
canal同步报错Target column: NAME not matched
canal同步报错Target column: NAME not matched