解决DataX⽀持Mysql8的读写
前⾔:如果是第⼀次安装使⽤datax,或您服务器Mysql版本是 <= 5.7的,请先参考我之前的随笔:。getelementsbytagname的返回值
背景:Mysql从5.6升级到8.0.19之后,发现原先正常跑的datax出错了。
先来看下我的报错信息:(看不清请放⼤⽹页)
12020-03-1810:00:10.038 [0-0-0-writer] ERROR StdoutPluginCollector -
英格兰vs威尔士世界杯2 java.sql.SQLException: Could not retrieve transation read-only status server
3 sql.ateSQLException(SQLError.java:996) ~[mysql-connector-java-5.1.34.jar:5.1.34]
4 sql.ateSQLException(SQLError.java:935) ~[mysql-connector-java-5.1.34.jar:5.1.34]
mysql怎么读英语5 sql.ateSQLException(SQLError.java:924) ~[mysql-connector-java-5.1.34.jar:5.1.34]
6 sql.ateSQLException(SQLError.java:870) ~[mysql-connector-java-5.1.34.jar:5.1.34]
7 sql.ateSQLException(SQLError.java:902) ~[mysql-connector-java-5.1.34.jar:5.1.34]
8 sql.ateSQLException(SQLError.java:892) ~[mysql-connector-java-5.1.34.jar:5.1.34]
9 sql.jdbc.ConnectionImpl.isReadOnly(ConnectionImpl.java:3607) ~[mysql-connector-java-5.1.34.jar:5.1.34]
10 sql.jdbc.ConnectionImpl.isReadOnly(ConnectionImpl.java:3576) ~[mysql-connector-java-5.1.34.jar:5.1.34]
trunc函数使用时间11 sql.jdbc.PreparedStatement.checkReadOnlySafeStatement(PreparedStatement.java:1114) ~[mysql-connector-java-5.1.34.jar:5.1.34]
12 sql.ute(PreparedStatement.java:1134) ~[mysql-connector-java-5.1.34.jar:5.1.34]
13 at com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Task.doOneInsert(CommonRdbmsWriter.java:382) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
14 at com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Task.doBatchInsert(CommonRdbmsWriter.java:362) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
15 at com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Task.startWriteWithConnection(
CommonRdbmsWriter.java:297) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
16 at com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Task.startWrite(CommonRdbmsWriter.java:319) [plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
17 at com.alibaba.datax.sqlwriter.MysqlWriter$Task.startWrite(MysqlWriter.java:78) [mysqlwriter-0.0.1-SNAPSHOT.jar:na]
18 at com.askgroup.runner.WriterRunner.run(WriterRunner.java:56) [datax-core-0.0.1-SNAPSHOT.jar:na]
19 at java.lang.Thread.run(Thread.java:748) [na:1.8.0_241]
20 Caused by: java.sql.SQLException: Unknown system variable 'tx_read_only'
View Code
只需关注第⼀⾏和最后⼀⾏。第⼀⾏你去百度,部分资料会告诉你让你设置下数据库“事务隔离级别”,参考:
SET GLOBAL transaction_isolation='READ-COMMITTED';
本⼈也尝试过,对Mysql8⽽⾔报错依旧,不过其它mysql版本可以尝试该解决⽅案。参考:,发现最终原因应该还是驱动版本不问题。
再来关注最后⼀⾏:java.sql.SQLException: Unknown system variable 'tx_read_only',⼤部分的资料表明是驱动版本不⼀致的问题。总结以上,致命原因只有⼀个,就
是“mysql的驱动版本不对”,所以解决⽅案⾃然就是升级驱动了。
⾸先查看下原来的驱动:
ll {%Datax_Path}/plugin/writer/mysqlwriter/libs/ | grep mysql-con
截⾄2020/03/23,上下载的最新datax tar包所包含的mysql驱动是mysql-connector-java-5.1.34.jar。的确不匹配啊,此时有⼈会第⼀时间想到从⽹上直接下载8的驱动丢进去
或替换就好了,
参考:
weight是净重还是毛重的意思
思路没问题,不过不能彻底解决问题,⽽且会有⼀些error、warning出来。⽐如:
1、ERROR: zeroDateTimeBehavior=convertToNull要改为CONVERT_TO_NULL
2、WARN: Loading class `sql.jdbc.Driver'. This is deprecated. The new driver class is `sql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
ssh默认用户名密码3、WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For com 所以我们要采⽤“修改源码,⾃⾏编译”的⽅式来彻底解决所有问题。参考:
第⼀步下载源码:
git clone⽅式或直接github/alibaba/DataX/archive/master.zip下载。
第⼆步修改mysql-connector-java驱动的版本号:
到位于 {DataX_source_code_home}/mysqlreader/ 和 {DataX_source_code_home}/mysqlwriter/ 下的l⽂件,将version的值改为8.0.X(可以直接搜索‘mysql-
connector-java’快速定位,X写你⾃⼰想要的版本号)
如果你只⽤到了mysql的写,可以只修改mysqlwriter⽬录下的xml⽂件。
第三步修改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
# ⾃⾏检索 {DataX_source_code_home}/⽂件夹下所有包含convertToNull字符串的⽂件,定位到⽂件再替换
vim {DataX_source_code_home}/plugin-rdbms-util/src/main/java/com/alibaba/datax/plugin/rdbms/util/DataBaseType.java
# 然后命令模式下全⽂替换
:%s/convertToNull/CONVERT_TO_NULL/
到此,如果跳过第四、五步直接打包datax,程序已经能正确运⾏,如果想完美解决其他警告,请按步骤继续。
第四步修改jdbc驱动的名称sql.jdbc.Driver 为 sql.cj.jdbc.Driver
vi {DataX_source_code_home}/plugin-rdbms-util/src/main/java/com/alibaba/datax/plugin/rdbms/util/DataBaseType.java
vi {DataX_source_code_home}/adswriter/src/main/java/com/alibaba/datax/plugin/writer/adswriter/load/AdsHelper.java
全⽂替换 sql.jdbc.Driver 为 sql.cj.jdbc.Driver。
第五步jdbc链接追加useSSL=false设置:
⽐如:python datax.py file.json ,则file.json的配置项:"jdbcUrl":"jdbc:mysql://${writer_gateway}/oms?useUnicode=true&characterEncoding=UTF-8&useSSL=false", 第六步通过maven打包:(本⼈是参考来的)
cd {DataX_source_code_home}
mvn -U clean package assembly:assembly -st.skip=true
打包成功,⽇志显⽰如下:
[INFO] BUILD SUCCESS
[INFO] -----------------------------------------------------------------
[INFO] Total time: 08:12 min
[INFO] Finished at: 2015-12-13T16:26:48+08:00
[INFO] Final Memory: 133M/960M
[INFO] -----------------------------------------------------------------
打包成功后的DataX包位于 {DataX_source_code_home}/target/datax/datax/ ,查看datax/plugin/writer/mysqlwriter/libs/⽬录,已经包含新版的驱动jar包
最后⼀步:
就是把datax移动到你希望的位置,然后执⾏:python datax.py ./file.json,⾄此,OVER
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论