1、环境

  • jdk1.8
  • python2.7.x
  • datax下载
    https://github.com/alibaba/DataX/blob/master/userGuid.md

    windows推荐方法一下载解压即可,我的目录是D:\datax
  • 自检脚本
    来到datx的bin目录下cmd执行python datax.py ../job/job.json

    出现这个页面就ok;乱码看着不舒服可以先执行chcp 65001更改一下字符编码;

2、配置示例

datax是通过json文件配置job的运行规则的
通过python datax.py -r streamreader -w streamwriter可获得示例脚本

{"job": {"content": [{"reader": {"name": "streamreader","parameter": {"column": [],"sliceRecordCount": ""}},"writer": {"name": "streamwriter","parameter": {"encoding": "","print": true}}}],"setting": {"speed": {"channel": ""}}}}

根据此模板在bin下新建stream.json文件
例如:

{"job": {"content": [{"reader": {"name": "streamreader","parameter": {"sliceRecordCount": 10,"column": [{"type": "long","value": "10"},{"type": "string","value": "hello,你好,世界====="}]}},"writer": {"name": "streamwriter","parameter": {"encoding": "UTF-8","print": true}}}],"setting": {"speed": {"channel": 5 }}}}
  • 执行脚本
    cd 到bin目录python datax.py stream.json

    成功打印即可。
  • 实际配置在github上有具体的详解

3、读取mysql输出到控制台

新建mysqlreader.json

{ "job": {"setting": {"speed": { "channel": 3, "interval": 30000, "times": 0 }, "errorLimit": { "record": 0, "percentage": 0.02}}, "content": [{ "reader": { "name": "mysqlreader", "parameter": { "username": "root", "password": "123qwe", "column": ["*"], "where":"day>=current_date()", "splitPk": "", "connection": [{ "table": [ "sczb_30"], "jdbcUrl": [ "jdbc:mysql://127.0.0.1:3306/poc" />

数据库的连接信息就不说了,sczb_30为要读取的表名,column为字段名,我这里配的*通配符,where可以做筛选条件,官网说不能跟limit,其他的order,group什么的我也没试过,没有where就是全量读取。
保存后执行python datax.py mysqlreader.json

4、mysql同步到mysql

新建mysql2mysql.json

{"job": {"setting": {"speed": {"channel": 1}},"content": [{"reader": {"name": "mysqlreader","parameter": {"username": "root","password": "123qwe","splitPk": "","connection": [{"jdbcUrl": ["jdbc:mysql://127.0.0.1:3306/poc" />DATE_SUB(NOW(), INTERVAL 20 MINUTE);"]}]}},"writer": {"name": "mysqlwriter","parameter": {"writeMode": "update","username": "root","password": "root","column": ["*"],"session": ["set session sql_mode='ANSI'"],"preSql": [""],"connection": [{"jdbcUrl": "jdbc:mysql://192.168.31.55:3306/datax?useUnicode=true&characterEncoding=utf8","table": ["TGEQUIPRECORDSUB"]}]}}}]}}

reader是读,writer是写,这里要注意的是读取时我用了querySql来筛选数据,另外写入是preSql这里可以在写入之前执行sql,例如把表清空,但是要注意账号权限,writeMode是写入模式,insert是追加,update是有则更新无则追加。
执行测试前先看一下数据
源表:

我把这个字段由333改为444
目标表:

执行同步python datax.py mysql2mysql.json

可以看到已经同步了。

5、定时执行达到延时同步的效果

新建bat脚本job.bat

@echo offtitle "job"set INTERVAL=60000::定时,单位是什么我给忘了,好像是秒?可以自己实验一下timeout %INTERVAL% :Again for /F "tokens=1-3 delims=/ " %%d in ('date /t') do (set "day=%%d"set "month=%%e"set "year=%%f")d:cd D:\datax\bin:: 创建文件夹名,格式为YYYY-MM-DDset "foldername=%year%-%month%-%day%":: 检查文件夹是否存在if not exist "%foldername%" (:: 创建文件夹md "%foldername%") else (echo 文件夹已存在,无需创建。) :: 这里的文件夹是日志输出文件按照日期划分start /b cmd /k D: && cd D:\datax\bin &&python datax.py ./mysql2mysql.json >> "%foldername%/test.log" 2>&1echo %date% %time:~0,8% timeout %INTERVAL% ax.py ./mysql2mysql.json >> "%foldername%/test.log" 2>&1echo %date% %time:~0,8% timeout %INTERVAL% goto Again

双击bat便可执行,在同目录下可观察到日志文件生成


看来单位是秒
但是怎么能容忍这个窗口的存在呢,看着巨丑,影响心情
新建job.vbs

CreateObject("Wscript.Shell").Run "D:\datax\bin\job.bat", 0, False

以后只运行此脚本就行了,什么窗口也不弹出,但是日志文件在持续增加。

6、结语

一定要避免全量同步,要根据字段进行增量更新
多个任务要写多个脚本,但是都能集成到同一个bat脚本里启动
其他数据库同步都大差不差