datax的安装与使用
DataX 是阿里云 DataWorks数据集成(DataX团队的商业化产品)的开源版本,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。它实现了包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS 等各种异构数据源之间高效的数据同步功能。
[TOC]
安装datax
- 第1步,安装 python 2.x 及 java 1.8,过程省略
[root@localhost ~]# python -V
Python 2.7.5
[root@localhost ~]# java -version
openjdk version "1.8.0-272"
OpenJDK Runtime Environment (build 1.8.0-272-b10)
OpenJDK 64-Bit Server VM (build 25.71-b10, mixed mode)
- 第2步,下载 datax v202309
cd /opt/
wget -c http://iso.sqlfans.cn/mysql/datax_v202309.tar.gz
tar zxvf datax_v202309.tar.gz
chmod -R 755 datax
- 第3步,编写同步任务的配置文件(参考配置模板)
touch /opt/datax/job/xxx.json
#.参考配置模板
#.从sqlserver到mysql 请参考:curl -sL http://iso.sqlfans.cn/mysql/config/datax/mssql2mysql.json
#.从mysql到sqlserver 请参考:curl -sL http://iso.sqlfans.cn/mysql/config/datax/mysql2mssql.json
#.从sqlserver到sqlserver 请参考:curl -sL http://iso.sqlfans.cn/mysql/config/datax/mssql2mssql.json
#.从mysql到mysql(字段到字段)请参考:curl -sL http://iso.sqlfans.cn/mysql/config/datax/mysql2mysql-querySql.json
#.从mysql到mysql(查询到字段)请参考:curl -sL http://iso.sqlfans.cn/mysql/config/datax/mysql2mysql-column.json
- 第4步,手动执行 datax 任务
cd /opt/datax/
python ./bin/datax.py ./job/xxx.json
- 第5步,部署成 crontab 定时执行任务,示例
每天23:59执行一次
59 23 * * * python /opt/datax/bin/datax.py /opt/datax/job/xxx.json > /dev/null 2>&1
常用的脚本
- 针对sqlserver表,快速返回字段list,比如
当前库.dbo.yyy表
DECLARE @table sysname
SET @table = 'yyy'
SELECT STUFF((SELECT ',' + col.name FROM sys.tables AS tbl WITH(NOLOCK) LEFT JOIN sys.syscolumns AS col WITH(NOLOCK) ON tbl.object_id = col.id AND tbl.name = @table ORDER BY col.colid FOR XML PATH('')),1,1,'')
- 针对mysql表,快速返回字段list,比如
xxx库.yyy表
(使用 双引号套反引号 可解决关键字冲突问题)
select GROUP_CONCAT("""`",column_name,"`""") from information_schema.columns where table_schema='xxx' and table_name='yyy' order by ORDINAL_POSITION;
- 针对sqlserver分表,生成批量化脚本,比如
xxx_user_shard1库.dbo.UserAccount_xxx表
(注意UserAccount_xxx.json
是一个模板配置)
DECLARE @db sysname
DECLARE @sql nvarchar(max)
DECLARE @min int, @max int
SET @db = 'xxx_pay_user_shard1'
SET @min = 1; -- 1 33 65 97
SET @max = 32 ; -- 32 64 96 128
WHILE @min <= @max
BEGIN
SET @sql = 'sed "s/xxx/aaa/" job/'+@db+'/UserAccount_xxx.json > job/'+@db+'/UserAccount_aaa.json' + char(10)
+ 'python ./bin/datax.py ./job/'+@db+'/UserAccount_aaa.json'
SET @sql = REPLACE(@sql, 'aaa', RIGHT(CAST(10000 + @min AS varchar(10)), 3))
PRINT (@sql)
SET @min = @min + 1
END
遇到的问题
- 问题1:Python版本要为2,原因前面已经说过了
- 问题2:cmd乱码修复:输入
CHCP 65001
改变代码页 - 问题3:数据库中的数据中文乱码解决:在jdbcUrl项加上
?characterEncoding=utf8
,比如
"jdbcUrl": ["jdbc:mysql://127.0.0.1:3306/dq?characterEncoding=utf8"]
- 问题4:在windows下测试mssql2mssql的时候,遇到中文乱码解决:在jdbcUrl项加上
characterEncoding=utf8
,比如
"jdbcUrl": "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=dbtest;characterEncoding=utf8"
- 问题5:mysql的字段名与关键字冲突,报错:
Code:[DBUtilErrorCode-01], Description:[获取表字段相关信息失败.]. - 获取表:zt_lang 的字段的元信息时失败
"column": ["id","`key`","`value`"]
- 问题6:批量任务配置成crontab报错
/bin/sh: java: command not found
,解决如下:
source /etc/bashrc
python /opt/datax/bin/datax.py /opt/datax/job/aaa.json
python /opt/datax/bin/datax.py /opt/datax/job/bbb.json
- 问题7:同样的配置,部分表同步报 timeout,具体如下:
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Application was streaming results when the connection failed.
Consider raising value of 'net_write_timeout' on the server.
解决7:在jdbcUrl数据源URL的连接上添加参数 net_write_timeout 及 netTimeoutForStreamingResults 并设置稍微大一些,比如
characterEncoding=utf8&net_write_timeout=600&netTimeoutForStreamingResults=28800
问题8:从mysql同步到mysql出现目的端数据重复,配置preSql先tuncate再同步则得以解决
"writeMode":"replace",
"preSql":["truncate table xxx"],