上一篇文章介绍了如何编译DataX,这一篇介绍如何通过DataX同步数据。以 mysql 和 clickhouse 为例
DataX 可以用来做全量的数据迁移;如果要用 DataX 做增量同步,则需要额外带一个时间戳字段
进入可执行目录
首先进入到 target/datax/datax/bin
目录下,可以看到3个python文件
- datax.py
- dxprof.py
- perftrace.py
制作job配置文件
DataX完成单个数据同步的作业,我们称之为Job,DataX接受到一个Job之后,将启动一个进程来完成整个作业同步过程。DataX Job模块是单个作业的中枢管理节点,承担了数据清理、子任务切分(将单一作业计算转化为多个子Task)、TaskGroup管理等功能。
生成模板
执行 python datax.py -r {YOUR_READER} -w {YOUR_WRITER}
,然后将控制台生成的模板,保存到 datax的job目录下,存为一个json文件。也可以执行 python datax.py -r {YOUR_READER} -w {YOUR_WRITER} > ../job/test.json
直接将输出重定至到文件中
模板如下
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"column": [],
"connection": [
{
"jdbcUrl": [],
"table": []
}
],
"password": "",
"username": "",
"where": ""
}
},
"writer": {
"name": "clickhousewriter",
"parameter": {
"batchByteSize": 134217728,
"batchSize": 65536,
"column": [
"col1",
"col2",
"col3"
],
"connection": [
{
"jdbcUrl": "jdbc:clickhouse://<host>:<port>[/<database>]",
"table": [
"table1",
"table2"
]
}
],
"dryRun": false,
"password": "password",
"postSql": [],
"preSql": [],
"username": "username",
"writeMode": "insert"
}
}
}
],
"setting": {
"speed": {
"channel": ""
}
}
}
}
根据实际数据库修改模板
修改好的模板如下(使用 cat ../job/mysql2clickhouse.json | xsel -i -b
可以将文件的内容复制到剪贴板)
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"column": [
"id",
"testTime",
"dbtype",
"tbname",
"nrows",
"ncols",
"abbr",
"cmd",
"cost",
"memG"
],
"connection": [
{
"jdbcUrl": ["jdbc:mysql://***.***.***.***:13306/dbtest?useUnicode=true&characterEncoding=utf-8&useSSL=false"],
"table": [
"exec"
]
}
],
"password": "******",
"username": "root",
"where": ""
}
},
"writer": {
"name": "clickhousewriter",
"parameter": {
"batchByteSize": 134217728,
"batchSize": 65536,
"column": [
"id",
"testTime",
"dbtype",
"tbname",
"nrows",
"ncols",
"abbr",
"cmd",
"cost",
"memG"
],
"connection": [
{
"jdbcUrl": "jdbc:clickhouse://***.***.***.***:8123/test2",
"table": [
"exec"
]
}
],
"dryRun": false,
"password": "******",
"postSql": [],
"preSql": [],
"username": "root",
"writeMode": "insert"
}
}
}
],
"setting": {
"speed": {
"channel": "5"
}
}
}
}
运行job
运行 job 的命令如下(二选一)
python datax.py ../job/mysql2clickhouse.json
python datax.py --jvm="-Xms3G -Xmx3G" ../job/test.json
用户名和密码都是必填项
由于目标数据库可以使用默认用户名密码登录,因此配置文件中username和password就直接留空了。结果报了如下错误,说明DataX一定要你填个用户名密码,不然无法正常执行。
JDBC的额外配置参数
不建议在没有服务器身份验证的情况下建立SSL连接。根据MySQL 5.5.45+、5.6.26+和5.7.6+的要求,如果不设置显式选项,则必须建立默认的SSL连接。您需要通过设置useSSL=false显式地禁用SSL,或者设置useSSL=true并为服务器证书验证提供信任存储
jdbc:mysql://127.0.0.1:3306/databaseName?useUnicode=true&characterEncoding=utf-8&useSSL=false
必须预先建表
直接执行job后,报如下错误。提示是因为目标数据库中没有这个表。因此在使用DataX进行数据同步时,必须在目标数据库预先建立对应的表结构。
column个数必须相同
配置的时候把源表的column全列出来了,由于仅需要抽取部分字段,因此目标column只配了部分。执行job,报如下错误。
说明 —— 在json配置文件中,源column的个数,必须与目标column的个数相同。
同步成功