需求:用datax技术把数据从gauseDb导入到mySql数据库
问题:按正常datax配置pgsqlReder和mySqlWriter后,报错信息如下:
2021-06-13 00:36:13.310 [job-0] ERROR JobContainer - Exception when job run com.alibaba.datax.common.exception.DataXException: Code:[DBUtilErrorCode-07], Description:[读取数据库数据失败. 请检查您的配置的 column/table/where/querySql或者向 DBA 寻求帮助.]. - 执行的SQL为: delete from wjybjy.wjybjy_sy where t_month='2021-05' 具体错误信息为:java.sql.SQLException: Could not retrieve transation read-only status server
解决问题:搜索错误信息‘Could not retrieve transation read-only status server’
得到结果是jdbc驱动包和mysql的版本对不上,目标库mysql是8.0.11版本,而datax中jdbc的版本是5.1.32
开始驱动升级
第一步下载源码:
https://github.com/alibaba/DataX/archive/master.zip下载。
2.二步修改mysql-connector-java驱动的版本号:
找到位于 {DataX_source_code_home}/mysqlreader/ 和 {DataX_source_code_home}/mysqlwriter/ 下的 pom.xml文件,将version的值改为8.0.X(可以直接搜索‘mysql-connector-java’快速定位,X写你自己想要的 版本号)
如果你只用到了mysql的写,可以只修改mysqlwriter目录下的xml文件。
3.第三步修改zeroDateTimeBehavior的值convertToNull 为 CONVERT_TO_NULL:
编辑{DataX_source_code_home}/plugin-rdbms- util/src/main/java/com/alibaba/datax/plugin/rdbms/util/DataBaseType.java
全文替换 convertToNull 为 CONVERT_TO_NULL;
全文替换"com.mysql.jdbc.Driver"为"com.mysql.cj.jdbc.Driver",
4.第四步通过maven打包:(本人是参考Git上开发者提供的操作步骤来的)
下载maven并按装,配置环境变量
用maven重新编辑构建发布mvn -U clean package assembly:assembly -Dmaven.test.skip=true
在这里可以修改DataX目录下的pom.xml和package.xml,只构建打包需要的reader和writer.
打包成功后的DataX包位于 {DataX_source_code_home}/target/datax/datax/ ,查看datax/plugin/writer/mysqlwriter/libs/目录,已经包含新版的驱动jar包
拷贝整个 {DataX_source_code_home}/target/datax/目录下的datax目录,到需要用到服务器。
json格式如下:
{ "job": { "setting": { "speed": { "channel": 1 } }, "content": [ { "reader": { "name": "postgresqlreader", "parameter": { "connection": [ { "querySql":["select t_month,t_code,t_type,t_name,t_value from mdl_ddpt_wjy.wjybjy_sy where t_month='$month'"], "jdbcUrl": ["jdbc:postgresql://192.123.84.11:25308/DB_ZTK"] } ], "password": "Liantong12#$", "username": "renshedb1" } }, "writer": { "name": "mysqlwriter", "parameter": { "writeMode": "insert", "username": "root", "password": "Perfect1", "column": [ "t_month", "t_code", "t_type", "t_name", "t_value" ], "session": [ "set session sql_mode='ANSI'" ], "preSql": [ "delete from wjybjy.wjybjy_sy where t_month='$month'" ], "connection": [ { "jdbcUrl": "jdbc:mysql://192.125.30.169:3306/wjybjy?useUnicode=true&characterEncoding=gbk&useSSL=false&serverTimezone=UTC", "table": [ "wjybjy_sy" ] } ] } } }] } }
其中mysqlwriter 中:
"jdbcUrl": "jdbc:mysql://192.125.30.169:3306/wjybjy?useUnicode=true&characterEncoding=gbk&useSSL=false&serverTimezone=UTC",
需要注意的几点:1.writer中不能带[]; reader中必须带[]。
2.需要加&useSSL=false&serverTimezone=UTC"
3."setting": {
"speed": {
"channel": 1
}
},
必须设置速度,但不能设置byte。