Otter同步报错 Caused by: java.lang.NoSuchFieldError: MYSQL

1. 报错日志

复制代码
pid:2 nid:1 exception:canal:canal4:com.alibaba.otter.canal.parse.exception.CanalParseException: java.lang.NoSuchFieldError: MYSQL
Caused by: java.lang.NoSuchFieldError: MYSQL
at com.alibaba.otter.canal.parse.inbound.mysql.ddl.DruidDdlParser.parse(DruidDdlParser.java:51)
at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.LogEventConvert.parseQueryEvent(LogEventConvert.java:258)
at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.LogEventConvert.parse(LogEventConvert.java:120)
at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.LogEventConvert.parse(LogEventConvert.java:71)
at com.alibaba.otter.canal.parse.inbound.AbstractEventParser.parseAndProfilingIfNecessary(AbstractEventParser.java:414)
at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$1$1.sink(AbstractEventParser.java:214)
at com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection.dump(MysqlConnection.java:185)
at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$1.run(AbstractEventParser.java:276)
at java.lang.Thread.run(Thread.java:748)

2. 原因分析

java.lang.NoSuchFieldError 通常是访问了某个类不存在的成员变量,可能是代码没编译更新,或者使用了不同版本的依赖。

在Otter这里是使用了不同的 Druid 版本。

Canal 1.1.5中 Druid版本为1.2.6,Otter中被改为了1.1.9。

3. 解决办法

有2个步骤,亲测有效:

1 修改Druid版本

otter项目最外层的pom文件194行
<version>1.1.9</version> 改成 <version>1.2.6</version>

2 更新代码

bash 复制代码
// 130行
if (x.isIfNotExiists()) {
            print0(ucase ? "IF NOT EXISTS " : "if not exists ");
}
// 改成(拼写错误)
if (x.isIfNotExists()) {
            print0(ucase ? "IF NOT EXISTS " : "if not exists ");
}
bash 复制代码
// 158行 239行
for (Map.Entry<String, SQLObject> option : x.getTableOptions().entrySet()) {
                String key = option.getKey();
...
// 改成(方法改变)
 for (SQLAssignItem option : x.getTableOptions()) {
                String key = ((SQLIdentifierExpr) option.getTarget()).getName();
...

需要注意:

1 文件位置: node/etl/src/main/java/com/alibaba/otter/node/etl/common/db/utils/DdlUtils.java

2 需要 import com.alibaba.druid.sql.ast.statement.SQLAssignItem;

可以参考 github issue

https://github.com/alibaba/otter/issues/1068

相关推荐
-SGlow-1 小时前
MySQL相关概念和易错知识点(2)(表结构的操作、数据类型、约束)
linux·运维·服务器·数据库·mysql
爱装代码的小瓶子1 小时前
数据结构之队列(C语言)
c语言·开发语言·数据结构
YuTaoShao2 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw3 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
Maybe_ch3 小时前
.NET-键控服务依赖注入
开发语言·c#·.net
超浪的晨3 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
终焉暴龙王3 小时前
CTFHub web进阶 php Bypass disable_function通关攻略
开发语言·安全·web安全·php
双力臂4043 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
水瓶_bxt4 小时前
Centos安装HAProxy搭建Mysql高可用集群负载均衡
mysql·centos·负载均衡
♡喜欢做梦4 小时前
【MySQL】深入浅出事务:保证数据一致性的核心武器
数据库·mysql