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"],
Copyright © www.sqlfans.cn 2023 All Right Reserved更新时间: 2024-01-16 14:58:52

results matching ""

    No results matching ""