重编译DataX使其支持MySQL8.0

问题描述:

使用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

  1. 下载DataX源码
    通过git clone或者直接下载datax-master.zip来获取源码
  2. 更改插件的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进行修改

  1. 修改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>
  1. 修改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
  1. maven重编译DataX
cd DataX-master
mvn -U clean package assembly:assembly -Dmaven.test.skip=true
  1. 复制重新编译好的插件到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

  1. 验证
    编写一个mysqljob的任务,执行
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Loiterer_Y/article/details/115692010
今日推荐