问题描述:
使用DataX迁移MySQL8.0时,报连接失败:
RetryUtil - Exception when calling callable, 即将尝试执行第1次重试.本次重试计划等待[1000]ms,实际等待[1000]ms,
异常Msg:[Code:[DBUtilErrorCode-10], Description:[连接数据库失败. 请检查您的 账号、密码、数据库名称、IP、Port或者向 DBA 寻求帮助(注意网络环境).]. -
具体错误信息为:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.
原因分析:
根据异常日志最后一行com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.]
可定位出根本问题是由于MySQL驱动不支持所致。
通过查看mysql的插件mysqlwriter/mysqlreader
的lib文件夹可知,DataX目前使用的是mysql驱动是mysql-connector-java-5.1.34.jar
,该驱动不支持mysql8的连接。
解决方案:
更改mysql驱动版本,对部分代码进行修改,重载DataX
- 下载DataX源码
通过git clone
或者直接下载datax-master.zip来获取源码 - 更改插件的pom依赖,升级mysql驱动
此处由于我只用到mysqlwriter插件,因此我只修改读插件的pom.xml
vi DataX-master\mysqlwriter\pom.xml
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
通过查看源码,MysqlWriter.java中引入了com.alibaba.datax.plugin.rdbms.util.DataBaseType
,因此需要对DataBaseType进行修改
- 修改rdbms的pom.xml,升级MySQL驱动
vi DataX-master\plugin-rdbms-util\pom.xml
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
- 修改
DataBaseType.java
源码,
此处涉及2个点的修改,
一是将com.mysql.jdbc.Driver
修改为com.mysql.cj.jdbc.Driver
;
二是将连接属性中的zeroDateTimeBehavior=convertToNull
改为
zeroDateTimeBehavior=CONVERT_TO_NULL
;
vi DataX-master\plugin-rdbms-util\src\main\java\com\alibaba\datax\plugin\rdbms\util
- maven重编译DataX
cd DataX-master
mvn -U clean package assembly:assembly -Dmaven.test.skip=true
- 复制重新编译好的插件到DataX
主要涉及三个jar包的复制:
$ cd DataX-master\mysqlwriter\target\datax\plugin\writer\mysqlwriter\libs
$ ls
mysql-connector-java-8.0.19.jar
plugin-rdbms-util-0.0.1-SNAPSHOT.jar
将上述的两个jar包复制到原先安装的DataX的/datax/plugin/writer/mysqlwriter/libs
下
$ cd DataX-master\mysqlwriter\target\datax\plugin\writer\mysqlwriter
$ ls
mysqlwriter-0.0.1-SNAPSHOT.jar
将上述jar包复制到原先安装的DataX的/datax/plugin/writer/mysqlwriter
下
- 验证
编写一个mysqljob的任务,执行