go-etl的datax是一个数据同步工具,目前支持MySQL,postgres,oracle,SQL SERVER,DB2等主流关系型数据库以及csv,xlsx文件之间的数据同步。
可以在最新发布版本下载到windows或者linux操作系统的64位版本二进制程序。
从下载包中获得datax二进制程序,在linux下如Makefile所示export LD_LIBRARY_PATH=/home/ibmdb/clidriver/lib,这个库从ibm db2下载,否则无法运行。
另外oracle需要下载oracle下载到对应64位版本odbc依赖,也可以在QQ群185188648群共享中中下载到。
调用datax十分简单,只要直接调用它即可
data -c config.json
-c 指定数据源配置文件
当返回值是0,并且显示run success,表示执行成功
当返回值是1,并且显示run fail,并告知执行失败的原因
数据源配置文件是json文件,使用数据源相互组合,如从mysql同步到postgres中
{
"core" : {
"container": {
"job":{
"id": 1,
"sleepInterval":100
}
}
},
"job":{
"content":[
{
"reader":{
"name": "mysqlreader",
"parameter": {
"username": "test:",
"password": "test:",
"column": ["*"],
"connection": {
"url": "tcp(192.168.15.130:3306)/source?parseTime=false",
"table": {
"db":"source",
"name":"type_table"
}
},
"where": ""
}
},
"writer":{
"name": "postgreswriter",
"parameter": {
"username": "postgres",
"password": "123456",
"writeMode": "insert",
"column": ["*"],
"preSql": [],
"connection": {
"url": "postgres://192.168.15.130:5432/postgres?sslmode=disable&connect_timeout=2",
"table": {
"schema":"destination",
"name":"type_table"
}
},
"batchTimeout": "1s",
"batchSize":1000
}
},
"transformer":[]
}
]
}
}
reader
和writer
的配置如下:
类型 | 数据源 | Reader(读) | Writer(写) | 文档 |
---|---|---|---|---|
关系型数据库 | MySQL/Mariadb/Tidb | √ | √ | 读、写 |
Postgres/Greenplum | √ | √ | 读、写 | |
DB2 LUW | √ | √ | 读、写 | |
SQL Server | √ | √ | 读、写 | |
Oracle | √ | √ | 读、写 | |
Sqlite3 | √ | √ | 读、写 | |
无结构流 | CSV | √ | √ | 读、写 |
XLSX(excel) | √ | √ | 读、写 |
注意在linux下如Makefile所示export LD_LIBRARY_PATH=${DB2HOME}/lib
- 使用cmd/datax/examples/mysql/init.sql初始化数据库用于测试
- 开启同步mysql命令
datax -c examples/mysql/config.json
- 使用cmd/datax/examples/postgres/init.sql初始化数据库用于测试
- 开启同步postgres命令
datax -c examples/postgres/config.json
- 注意使用前请下载相应的db2的odbc库,如linux的make dependencies和release.bat
- 注意在linux下如Makefile所示export LD_LIBRARY_PATH=${DB2HOME}/lib
- 注意在windows下如release.bat所示set path=%path%;%GOPATH%\src\github.com\ibmdb\go_ibm_db\clidriver\bin
- 使用cmd/datax/examples/db2/init.sql初始化数据库用于测试
- 开启同步命令
datax -c examples/db2/config.json
- 注意使用前请下载相应的Oracle Instant Client,例如,连接oracle 11g最好下载12.x版本。
- 注意在linux下如export LD_LIBRARY_PATH=/opt/oracle/instantclient_21_1:$LD_LIBRARY_PATH,另需要安装libaio
- 注意在windows下如set path=%path%;%GOPATH%\oracle\instantclient_21_1, Oracle Instant Client 19不再支持windows7
- 使用cmd/datax/examples/oracle/init.sql初始化数据库用于测试
- 开启同步命令
datax -c examples/oracle/config.json
- 使用cmd/datax/examples/sqlserver/init.sql初始化数据库用于测试
- 开启同步sql server命令
datax -c examples/sqlserver/config.json
- 使用cmd/datax/examples/csvpostgres/init.sql初始化数据库用于测试
- 开启同步命令
datax -c examples/csvpostgres/config.json
- 使用cmd/examples/datax/csvpostgres/init.sql初始化数据库用于测试
- 开启同步命令
datax -c examples/xlsxpostgres/config.json
- 使用cmd/datax/examples/csvpostgres/init.sql初始化数据库用于测试
- 开启同步命令
datax -c examples/postgrescsv/config.json
- 使用cmd/datax/examples/csvpostgres/init.sql初始化数据库用于测试
- 开启同步命令
datax -c examples/postgresxlsx/config.json
- 在使用前,请下载相应的SQLite驱动.
- 注意:在 Windows 系统上,设置
path=%path%;/opt/sqlite/sqlite3.dll
。 - 使用
cmd/datax/examples/sqlite3/init.sql
用于测试目的 初始化数据库 - 在
examples/sqlite3/config.json
文件中,url
表示 sqlite3 数据库文件的路径。在 Windows 系统上,它可以是E:\sqlite3\test.db
,而在 Linux 系统上,它可以是/sqlite3/test.db
。 - 启动 sqlite3 同步命令:
除了上述例子外,在go-etl特性中所列出的数据源都可以交叉使用,还配置例如mysql到postgresql数据源,mysql到oracle,oracle到db2等等,
{
"job":{
"setting":{
"pool":{
"maxOpenConns":8,
"maxIdleConns":8,
"connMaxIdleTime":"40m",
"connMaxLifetime":"40m"
},
"retry":{
"type":"ntimes",
"strategy":{
"n":3,
"wait":"1s"
},
"ignoreOneByOneError":true
}
}
}
}
- maxOpenConns: 最大连接打开数
- maxIdleConns: 最大空闲连接打开数
- connMaxIdleTime: 最大空闲时间
- connMaxLifetime: 最大生存时间
ignoreOneByOneError 是否忽略一个个重试错误
- 重试类型type和重试策略
- 类型有
ntimes
,指n次数重复重试策略,"strategy":{"n":3,"wait":"1s"}
,n代表重试次数,wait代表等待时间 - 类型有
forever
,指永久重复重试策略,"strategy":{"wait":"1s"}
,wait代表等待时间 - 类型有
exponential
,指幂等重复重试策略,"strategy":{"init":"100ms","max":"4s"}
,init代表开始时间,max代表最大时间
datax -c examples/global/config.json
这里假设数据按切分键分布是均匀的,合理使用这样的切分键可以使同步更快,另外为了加快对最大值和最小值的查询,这里对于大表可以预设最大最小值
- 使用程序生成mysql数据产生split.csv
cd cmd/datax/examples/split
go run main.go
- 使用init.sql建表
- 同步至mysql数据库
cd ../..
datax -c examples/split/csv.json
- 修改examples/split/config.json的split的key为id,dt,str
- mysql数据库切分同步整形,日期,字符串类型
datax -c examples/split/config.json
preSql和postSql分别是写入数据前和写入数据后的sql语句组
在本例子中,采用了全量导入的方式 1.写入数据前先建立了一个临时表 2.在写入数据后,将原表删除,将临时表重名为新表
datax -c examples/prePostSql/config.json
之前speed的byte和record配置并不会生效,现在加入流控特性后,byte和record将会生效,byte会限制缓存消息字节数,而record会限制缓存消息条数,如果byte设置过小会导致缓存过小而导致同步数据失败。当byte为0或负数时,限制器将不会工作, 例如byte为10485760,即10Mb(10x1024x1024)。
{
"job":{
"setting":{
"speed":{
"byte":10485760,
"record":1024,
"channel":4
}
}
}
}
- 使用程序生成src.csv,发起流控测试
cd cmd/datax/examples/limit
go run main.go
cd ../..
datax -c examples/limit/config.json
数据库读取器使用querySql去查询数据库
datax -c examples/querySql/config.json
配置数据源配置文件,如从mysql同步到postgres中
{
"core" : {
"container": {
"job":{
"id": 1,
"sleepInterval":100
}
}
},
"job":{
"content":[
{
"reader":{
"name": "mysqlreader",
"parameter": {
"username": "test:",
"password": "test:",
"column": ["*"],
"connection": {
"url": "tcp(192.168.15.130:3306)/source?parseTime=false",
"table": {
"db":"source",
"name":"type_table"
}
},
"where": ""
}
},
"writer":{
"name": "postgreswriter",
"parameter": {
"username": "postgres",
"password": "123456",
"writeMode": "insert",
"column": ["*"],
"preSql": [],
"connection": {
"url": "postgres://192.168.15.130:5432/postgres?sslmode=disable&connect_timeout=2",
"table": {
"schema":"destination",
"name":"type_table"
}
},
"batchTimeout": "1s",
"batchSize":1000
}
},
"transformer":[]
}
]
}
}
源目的配置向导文件是csv文件,每行配置可以配置如下:
path[table],path[table]
每一列可以是路径或者是表名,注意所有的表要配置库名或者模式名,需要在数据源配置文件配置。
datax -c tools/testData/xlsx.json -w tools/testData/wizard.csv
-c 指定数据源配置文件 -w 指定源目的配置向导文件。
执行结果会在数据源配置文件目录文件生成源目的配置向导文件行数的配置集,分别以指定数据源配置文件1.json,指定数据源配置文件2.json,...,指定数据源配置文件[n].json的配置集。
另外,在当前目录会生成执行脚本run.bat或者run.sh。
run.bat
linux
run.sh
可以运行cmd/datax/testData的测试数据
cd cmd/datax
datax -c testData/xlsx.json -w testData/wizard.csv
结果会在testData下生成wizard.csv行数的配置文件,分别以xlsx1.json,xlsx2.json,...,xlsx[n].json的配置集。
datax -h
帮助显示
Usage of datax:
-c string
config (default "config.json")
-http string
http
-w string
wizard
-http 新增监听端口,如:8080, 开启后访问127.0.0.1:8080/metrics获取实时的吞吐量
datax version
显示版本号
(git commit: git提交号
) complied by go version go版本号
v0.1.0 (git commit: c82eb302218f38cd3851df4b425256e93f85160d) complied by go version go1.16.5 windows/amd64
datax -http :8443 -c examples/limit/config.json
使用浏览器访问http://127.0.0.1:8443/metrics获取当前监控数据
{"jobID":1,"metrics":[{"taskGroupID":0,"metrics":[{"taskID":0,"channel":{"totalByte":2461370,"totalRecord":128624,"byte":3820,"record":191}}]}]}
- totalByte 总共数据同步的字节数
- totalRecord 总共数据同步的记录数
- byte 在通道里数据同步的字节数
- record 在通道里数据同步的记录数