DataX初次抽取数据记录排错过程(源库、目标库均连接失败)

数据环境

  • DataX安装环境:虚拟机,CentOS7
  • 源数据库:云主机,MySQL8.0
  • 目标数据库:本地,MySQL8.0

软件环境

  • DataX需求环境(参见dataX官网):
    • Maven 3.x
    • Java 1.8
    • python 2.7
  • DataX安装目录:/opt/module/dataX

配置源库和目标库

  • 切换到 DataX家目录
cd /opt/module/dataX
  • 查看配置文件模板
python bin/datax.py -r mysqlreader -w mysqlwriter

DataX (DATAX-OPENSOURCE-3.0), From Alibaba !
Copyright (C) 2010-2017, Alibaba Group. All Rights Reserved.


Please refer to the mysqlreader document:
     https://github.com/alibaba/DataX/blob/master/mysqlreader/doc/mysqlreader.md 

Please refer to the mysqlwriter document:
     https://github.com/alibaba/DataX/blob/master/mysqlwriter/doc/mysqlwriter.md 
 
Please save the following configuration as a json file and  use
     python {DATAX_HOME}/bin/datax.py {JSON_FILE_NAME}.json 
to run the job.

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader", 
                    "parameter": {
                        "column": [], 
                        "connection": [
                            {
                                "jdbcUrl": [], 
                                "table": []
                            }
                        ], 
                        "password": "", 
                        "username": "", 
                        "where": ""
                    }
                }, 
                "writer": {
                    "name": "mysqlwriter", 
                    "parameter": {
                        "column": [], 
                        "connection": [
                            {
                                "jdbcUrl": "", 
                                "table": []
                            }
                        ], 
                        "password": "", 
                        "preSql": [], 
                        "session": [], 
                        "username": "", 
                        "writeMode": ""
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": ""
            }
        }
    }
}

  • 创建配置文件

具体配置项目说明参见官网 https://github.com/alibaba/DataX

  • 将以上json文件写入文件
vim job/mysql2mysql.json
  • 粘贴以上json数据部分

  • 修改配置文件

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader", 
                    "parameter": {
                        "column": [
                            "etpsname",
                            "etpsno"
                        ],  
                        "connection": [
                            {   
                                "jdbcUrl": [
                                    "jdbc:mysql://***.***.***.***:3306/bigdata?useUnicode=true&characterEncoding=utf8"
                                ],  
                                "table": [
                                    "etps_no"
                                ]   
                            }   
                        ],  
                        "password": "密码", 
                        "username": "cigar", 
                        "where": "id <=1000 "
                    }   
                },  
                "writer": {
                    "name": "mysqlwriter", 
                    "parameter": {
                        "column": [
                            "etps_name",
                            "etps_no"
                        ],  
                        "connection": [
                            {   
                                "jdbcUrl": "jdbc:mysql://192.168.0.102:3306/datax?useUnicode=true&characterEncoding=utf8", 
                                "table": [
                                    "etps_no"
                                ]   
                            }   
                        ],  
                        "password": "root", 
                        "preSql": [], 
                        "session": [], 
                        "username": "root", 
                        "writeMode": "insert"
                    }   
                }   
            }   
        ],  
        "setting": {
            "speed": {
                "channel": "1"
             }
        }
    }
}

运行与调试

第一次运行(源库连接失败)

运行

python bin/datax.py job/mysql2mysql.json

报错

2020-03-09 15:40:00.703 [job-0] WARN  DBUtil - test connection of [jdbc:mysql://122.51.161.234:3306/bigdata?useUnicode=true&characterEncoding=utf8] failed, for Code:[DBUtilErrorCode-10], Description:[连接数据库失败. 请检查您的 账号、密码、数据库名称、IP、Port或者向 DBA 寻求帮助(注意网络环境).].  -  具体错误信息为:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server..
2020-03-09 15:40:00.708 [job-0] ERROR RetryUtil - Exception when calling callable, 异常Msg:DataX无法连接对应的数据库,可能原因是:1) 配置的ip/port/database/jdbc错误,无法连接。2) 配置的username/password错误,鉴权失败。请和DBA确认该数据库的连接信息是否正确。
java.lang.Exception: DataX无法连接对应的数据库,可能原因是:1) 配置的ip/port/database/jdbc错误,无法连接。2) 配置的username/password错误,鉴权失败。请和DBA确认该数据库的连接信息是否正确。
	at com.alibaba.datax.plugin.rdbms.util.DBUtil$2.call(DBUtil.java:71) ~[plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.DBUtil$2.call(DBUtil.java:51) ~[plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.common.util.RetryUtil$Retry.call(RetryUtil.java:164) ~[datax-common-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.common.util.RetryUtil$Retry.doRetry(RetryUtil.java:111) ~[datax-common-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.common.util.RetryUtil.executeWithRetry(RetryUtil.java:30) [datax-common-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.DBUtil.chooseJdbcUrl(DBUtil.java:51) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.reader.util.OriginalConfPretreatmentUtil.dealJdbcAndTable(OriginalConfPretreatmentUtil.java:92) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.reader.util.OriginalConfPretreatmentUtil.simplifyConf(OriginalConfPretreatmentUtil.java:59) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.reader.util.OriginalConfPretreatmentUtil.doPretreatment(OriginalConfPretreatmentUtil.java:33) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.reader.CommonRdbmsReader$Job.init(CommonRdbmsReader.java:55) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.reader.mysqlreader.MysqlReader$Job.init(MysqlReader.java:37) [mysqlreader-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.core.job.JobContainer.initJobReader(JobContainer.java:673) [datax-core-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.core.job.JobContainer.init(JobContainer.java:303) [datax-core-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.core.job.JobContainer.start(JobContainer.java:113) [datax-core-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.core.Engine.start(Engine.java:92) [datax-core-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.core.Engine.entry(Engine.java:171) [datax-core-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.core.Engine.main(Engine.java:204) [datax-core-0.0.1-SNAPSHOT.jar:na]

原因解析

  • 通过关键词发现是连接数据库时失败,写一段Java代码检测该JDBC连接是否能联网到数据库,代码如下
public class ConnMysql {

    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        connToMysql();
    }


    public static void connToMysql() throws ClassNotFoundException, SQLException {
        // 加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 获得连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://***.***.***.***:3306/bigdata?useUnicode=true&characterEncoding=utf8", "cigar", "密码");
        // 预处理SQL
        String sql = "select etpsname,etpsno from etps_no limit 100";
        Statement statement = connection.createStatement();
        // 执行语句
        ResultSet qu = statement.executeQuery(sql);

        // 处理结果
        while (qu.next()){
            String etpsName = qu.getString("etpsname");
            String etpsNo = qu.getString("etpsno");
            System.out.println(etpsName + " => " + etpsNo);
        }
        // 关闭资源
        statement.close();
        connection.close();
    }
}

以上代码可以获取到连接成功,并且查询到结果,说明JDBC连接没问题,需要从其他地方寻找错误。

  • 查询相关问题,有博客说可能是DataX的MySQL连接驱动包不支持MySQL8.0,所以将尝试将驱动包进行版本更新

问题解决

查看MySQL驱动包

ll /opt/module/dataX/plugin/reader/mysqlreader/libs
-rw-r--r--. 1 62265 users  518641 11月 24 2017 commons-collections-3.0.jar
-rw-r--r--. 1 62265 users  185140 11月 24 2017 commons-io-2.4.jar
-rw-r--r--. 1 62265 users  412739 11月 24 2017 commons-lang3-3.3.2.jar
-rw-r--r--. 1 62265 users 1599627 11月 24 2017 commons-math3-3.1.1.jar
-rw-r--r--. 1 62265 users   95053 11月 24 2017 datax-common-0.0.1-SNAPSHOT.jar
-rw-r--r--. 1 62265 users 1952759 11月 24 2017 druid-1.0.15.jar
-rw-r--r--. 1 62265 users  372746 11月 24 2017 fastjson-1.1.46.sec01.jar
-rw-r--r--. 1 62265 users  934783 11月 24 2017 guava-r05.jar
-rw-r--r--. 1 62265 users   45024 11月 24 2017 hamcrest-core-1.3.jar
-rw-r--r--. 1 62265 users  264600 11月 24 2017 logback-classic-1.0.13.jar
-rw-r--r--. 1 62265 users  418870 11月 24 2017 logback-core-1.0.13.jar
-rw-r--r--. 1 62265 users  960372 11月 24 2017 mysql-connector-java-5.1.34.jar
-rw-r--r--. 1 62265 users   95960 11月 24 2017 plugin-rdbms-util-0.0.1-SNAPSHOT.jar
-rw-r--r--. 1 62265 users   32119 11月 24 2017 slf4j-api-1.7.10.jar
  • mysql-connector-java-5.1.34.jar 包替换为 mysql-connector-java-8.0.17.jar
ll /opt/module/dataX/plugin/reader/mysqlreader/libs
-rw-r--r--. 1 62265 users  518641 11月 24 2017 commons-collections-3.0.jar
-rw-r--r--. 1 62265 users  185140 11月 24 2017 commons-io-2.4.jar
-rw-r--r--. 1 62265 users  412739 11月 24 2017 commons-lang3-3.3.2.jar
-rw-r--r--. 1 62265 users 1599627 11月 24 2017 commons-math3-3.1.1.jar
-rw-r--r--. 1 62265 users   95053 11月 24 2017 datax-common-0.0.1-SNAPSHOT.jar
-rw-r--r--. 1 62265 users 1952759 11月 24 2017 druid-1.0.15.jar
-rw-r--r--. 1 62265 users  372746 11月 24 2017 fastjson-1.1.46.sec01.jar
-rw-r--r--. 1 62265 users  934783 11月 24 2017 guava-r05.jar
-rw-r--r--. 1 62265 users   45024 11月 24 2017 hamcrest-core-1.3.jar
-rw-r--r--. 1 62265 users  264600 11月 24 2017 logback-classic-1.0.13.jar
-rw-r--r--. 1 62265 users  418870 11月 24 2017 logback-core-1.0.13.jar
-rw-r--r--. 1 62265 users  960372 11月 24 2017 mysql-connector-java-5.1.34.jar.bak
-rw-r--r--. 1 root  root  2321813 3月   9 00:54 mysql-connector-java-8.0.17.jar
-rw-r--r--. 1 62265 users   95960 11月 24 2017 plugin-rdbms-util-0.0.1-SNAPSHOT.jar
-rw-r--r--. 1 62265 users   32119 11月 24 2017 slf4j-api-1.7.10.jar

第二次运行(目标库连接失败)

运行

  • 使用命令开始执行
python bin/datax.py job/mysql2mysql.json

报错

2020-03-09 01:29:50.995 [job-0] ERROR RetryUtil - Exception when calling callable, 异常Msg:Code:[MYSQLErrCode-01], Description:[数据库用户名或者密码错误,请检查填写的账号密码或者联系DBA确认账号和密码是否正确].  - 该数据库用户名为:root 具体错误信息为:java.sql.SQLException: Access denied for user 'root'@'DESKTOP-OEAO22T' (using password: YES)
com.alibaba.datax.common.exception.DataXException: Code:[MYSQLErrCode-01], Description:[数据库用户名或者密码错误,请检查填写的账号密码或者联系DBA确认账号和密码是否正确].  - 该数据库用户名为:root 具体错误信息为:java.sql.SQLException: Access denied for user 'root'@'DESKTOP-OEAO22T' (using password: YES)
	at com.alibaba.datax.common.exception.DataXException.asDataXException(DataXException.java:26) ~[datax-common-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.RdbmsException.asConnException(RdbmsException.java:21) ~[plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.DBUtil.connect(DBUtil.java:394) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.DBUtil.connect(DBUtil.java:384) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.DBUtil.access$000(DBUtil.java:22) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.DBUtil$3.call(DBUtil.java:322) ~[plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.DBUtil$3.call(DBUtil.java:319) ~[plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.common.util.RetryUtil$Retry.call(RetryUtil.java:164) ~[datax-common-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.common.util.RetryUtil$Retry.doRetry(RetryUtil.java:111) ~[datax-common-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.common.util.RetryUtil.executeWithRetry(RetryUtil.java:30) [datax-common-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.DBUtil.getConnection(DBUtil.java:319) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.DBUtil.getConnection(DBUtil.java:303) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.JdbcConnectionFactory.getConnecttion(JdbcConnectionFactory.java:27) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.writer.util.OriginalConfPretreatmentUtil.dealColumnConf(OriginalConfPretreatmentUtil.java:105) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.writer.util.OriginalConfPretreatmentUtil.dealColumnConf(OriginalConfPretreatmentUtil.java:140) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.writer.util.OriginalConfPretreatmentUtil.doPretreatment(OriginalConfPretreatmentUtil.java:35) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Job.init(CommonRdbmsWriter.java:41) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.writer.mysqlwriter.MysqlWriter$Job.init(MysqlWriter.java:31) [mysqlwriter-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.core.job.JobContainer.initJobWriter(JobContainer.java:704) [datax-core-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.core.job.JobContainer.init(JobContainer.java:304) [datax-core-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.core.job.JobContainer.start(JobContainer.java:113) [datax-core-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.core.Engine.start(Engine.java:92) [datax-core-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.core.Engine.entry(Engine.java:171) [datax-core-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.core.Engine.main(Engine.java:204) [datax-core-0.0.1-SNAPSHOT.jar:na]

原因解析

通过关键词定位,发现DataX程序在写入时连接到本机上的MySQL被拒绝,说明网络通畅,是被MySQL的权限拒绝了。联想到之前使用Linux环境下的MySQL8.0,MySQL8.0版本对权限控制即为严格,root用户在默认情况下仅允许本地登录

验证猜想

  • 登录到本地mysql
mysql -uroot -proot
  • 切换库
mysql> use mysql;
  • 查看用户登录主机
mysql> select user,host from user;
+------------------+-----------+  
| user             | host      |  
+------------------+-----------+  
| mysql.infoschema | localhost |  
| mysql.session    | localhost |  
| mysql.sys        | localhost |  
| root             | localhost |  
+------------------+-----------+  

以上结果表明,root用户仅允许在localhost登录,不允许远程登录,造成DataX在写入时连接失败。

解决方案

  • 方案一:修改root用户的远程的登录地址为不限制(%表示不限制登录IP)
  • 方案二:创建一个可用于远程登录的用户(新创建的用户默认不限制登录IP)

此处选用方案二

解决问题

  • 创建用户
mysql> create user zhangsan identified by '密码';
  • 查看登录主机
mysql> select user,host from user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| zhangsan         | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
  • 修改密码认证方式为mysql_native_password ,用于远程登录
mysql> alter user 'zhangsan'@'%' identified with mysql_native_password by '密码';
  • 赋予新创建用户所有权限
mysql> grant all privileges on *.* to cigar@'%';

说明:此处为方便,赋予了新用户所有权限,使其相当于root用户。为了安全起见,仅赋予其基本增删改查权限即可。

  • 将新创建的用户名和密码修改到 mysql2mysql.json配置文件中(以下仅截取writer部分)
"writer": {
    "name": "mysqlwriter", 
    "parameter": {
        "column": [
            "etps_name",
            "etps_no"
        ],  
        "connection": [
            {   
                "jdbcUrl": "jdbc:mysql://192.168.0.102:3306/datax?useUnicode=true&characterEncoding=utf8", 
                "table": [
                    "etps_no"
                ]   
            }   
        ],  
        "password": "密码", 
        "preSql": [
            "truncate table etps_no;"
        ],  
        "session": [], 
        "username": "zhangsan", 
        "writeMode": "insert"
    }   
}   

第三次运行(目标库连接失败)

运行

  • 使用命令开始执行
python bin/datax.py job/mysql2mysql.json

报错

com.alibaba.datax.common.exception.DataXException: Code:[DBUtilErrorCode-10], Description:[连接数据库失败. 请检查您的 账号、密码、数据库名称、IP、Port或者向 DBA 寻求帮助(注意网络环境).].  -  具体错误信息为:java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
	at com.alibaba.datax.common.exception.DataXException.asDataXException(DataXException.java:26) ~[datax-common-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.RdbmsException.asConnException(RdbmsException.java:23) ~[plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.DBUtil.connect(DBUtil.java:394) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.DBUtil.connect(DBUtil.java:384) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.DBUtil.access$000(DBUtil.java:22) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.DBUtil$3.call(DBUtil.java:322) ~[plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.DBUtil$3.call(DBUtil.java:319) ~[plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.common.util.RetryUtil$Retry.call(RetryUtil.java:164) ~[datax-common-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.common.util.RetryUtil$Retry.doRetry(RetryUtil.java:111) ~[datax-common-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.common.util.RetryUtil.executeWithRetry(RetryUtil.java:30) [datax-common-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.DBUtil.getConnection(DBUtil.java:319) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.DBUtil.getConnection(DBUtil.java:303) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.util.JdbcConnectionFactory.getConnecttion(JdbcConnectionFactory.java:27) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.writer.util.OriginalConfPretreatmentUtil.dealColumnConf(OriginalConfPretreatmentUtil.java:105) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.writer.util.OriginalConfPretreatmentUtil.dealColumnConf(OriginalConfPretreatmentUtil.java:140) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.writer.util.OriginalConfPretreatmentUtil.doPretreatment(OriginalConfPretreatmentUtil.java:35) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Job.init(CommonRdbmsWriter.java:41) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.plugin.writer.mysqlwriter.MysqlWriter$Job.init(MysqlWriter.java:31) [mysqlwriter-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.core.job.JobContainer.initJobWriter(JobContainer.java:704) [datax-core-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.core.job.JobContainer.init(JobContainer.java:304) [datax-core-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.core.job.JobContainer.start(JobContainer.java:113) [datax-core-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.core.Engine.start(Engine.java:92) [datax-core-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.core.Engine.entry(Engine.java:171) [datax-core-0.0.1-SNAPSHOT.jar:na]
	at com.alibaba.datax.core.Engine.main(Engine.java:204) [datax-core-0.0.1-SNAPSHOT.jar:na]

原因解析

通过关键词定位发现,可能是时区问题,由于之前遇到过类似问题,仅需要在jdbc连接参数上加上时区即可

解决问题

编辑writer的jdbc连接

"writer": {
    "name": "mysqlwriter", 
    "parameter": {
        "column": [
            "etps_name",
            "etps_no"
        ],  
        "connection": [
            {   
                "jdbcUrl": "jdbc:mysql://192.168.0.102:3306/datax?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC", 
                "table": [
                    "etps_no"
                ]   
            }   
        ],  
        "password": "密码", 
        "preSql": [
            "truncate table etps_no;"
        ],  
        "session": [], 
        "username": "zhangsan", 
        "writeMode": "insert"
    }   
}   

第四次运行(成功)

运行

使用命令开始执行

python bin/datax.py job/mysql2mysql.json

运行结果

2020-03-09 01:34:02.251 [job-0] INFO  JobContainer - 
任务启动时刻                    : 2020-03-09 01:33:49
任务结束时刻                    : 2020-03-09 01:34:02
任务总计耗时                    :                 12s
任务平均流量                    :            1.76KB/s
记录写入速度                    :            100rec/s
读出记录总数                    :                1000
读写失败总数                    :                   0

BinGo!终于执行成功!

总结

  • 源库连接失败是因为MySQL驱动的版本问题
  • 目标库连接失败是因为使用root用户登录,但是MySQL8.0对root用户禁止远程登录
  • 目标库连接失败是因为时区不对应,需要连接时指定时区

疑问

  • 在本地使用Java代码测试JDBC连接时,MySQL驱动版本是 mysql-connector-java-5.1.6.jar ,可以连接成功并获取到数据,
  • DataX 默认的MySQL连接驱动版本是 mysql-connector-java-5.1.34.jar,连接数据库失败
  • 为何本地的低版本可以连接成功,而DataX的高版本反而连接失败,将其换成8.0版本才能连接成功?有大佬知道的可以指导交流一下。
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
DataX抽取Oracle数据时,如果字段中存在分隔符,可以采取以下解决方案。首先,可以修改建表分隔符,使用alter table语句将建表分隔符修改为与导入时的分隔符一致。例如,可以使用以下语句修改建表分隔符: ``` alter table table_name set serdeproperties('field.delim'='\t'); ``` 另外,也可以在建表时直接指定好分隔符,使用create table语句创建表时,通过row format delimited fields terminated by语句指定字段的分隔符。例如: ``` create table table_name( column1 datatype, column2 datatype ) row format delimited fields terminated by '\t'; ``` 此外,还需要注意分区表和无分区表的区别。对于分区表,需要在建表语句中添加partitioned by语句指定分区字段。 另外,如果目标表的存储格式为textfile,默认的列分隔符为\001,默认的行分隔符为\n。如果在Oracle源数据中存在\n作为行分隔符,会导致字段错位和数据量增加。为了解决这个问题,可以将源数据中的\n替换为其他字符,或者在导入时指定行分隔符为其他字符。 最后,如果需要在DataX中指定筛选条件,可以使用MysqlReader,并根据指定的column、table和where条件拼接SQL进行数据抽取。在实际业务场景中,通常会选择同步当天的数据,可以将where条件指定为gmt_create > $bizdate。需要注意的是,不可以将where条件指定为limit 10,因为limit不是SQL的合法where子句。 综上所述,可以通过修改建表分隔符、指定分隔符、替换行分隔符以及指定筛选条件等方式解决DataX抽取Oracle数据字段中存在分隔符的问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值