DataX在mysql间数据迁移操作
DataX概览
MysqlReader插件实现了从Mysql读取数据。在底层实现上,MysqlReader通过JDBC连接远程Mysql数据库,并执行相应的sql语句将数据从mysql库中SELECT出来。 不同于其他关系型数据库,MysqlReader不支持FetchSize.
可以开发自己的reader或writer插件,也可以对已经存在的进行改进
实现原理
简而言之,MysqlReader通过JDBC连接器连接到远程的Mysql数据库,并根据用户配置的信息生成查询SELECT SQL语句,然后发送到远程Mysql数据库,并将该SQL执行返回结果使用DataX自定义的数据类型拼装为抽象的数据集,并传递给下游Writer处理。 对于用户配置Table、Column、Where的信息,MysqlReader将其拼接为SQL语句发送到Mysql数据库;对于用户配置querySql信息,MysqlReader直接将其发送到Mysql数据库。
快速上手
构建一个测试数据表
新建表test语句如下所示。
CREATE TABLE `test` (
`name` varchar(20) COLLATE utf8_bin NOT NULL,
`age` int(4) NOT NULL,
`age_true` int(2) DEFAULT NULL
)
并向其中插入40条数据
insert into test(`name`,age,age_true) values("lihao",20,3)
...
然后新建表2:test1
CREATE TABLE `test1` (
`name` varchar(10) COLLATE utf8_bin NOT NULL,
`age1` int(10) NOT NULL
)
构建任务Json
DataX工具是用json文件作为配置文件的,根据官方提供文档我们构建Json文件如下所示。
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "DTCserver2019!",
"column": ["name","age"],
"where": "age<100",
"connection": [
{
"table": [
"test"
],
"jdbcUrl": [
"jdbc:mysql://10.3.7.231:3306/real_time_alarm_data?characterEncoding=utf8"
]
}
]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"username": "root",
"password": "DTCserver2019!",
"column": ["name","age1"],
"connection": [
{
"table": [
"test1"
],
"jdbcUrl":"jdbc:mysql://10.3.7.231:3306/real_time_alarm_data?characterEncoding=utf8"
}
]
}
}
}
],
"setting": {
"speed": {
"channel": 1,
"byte": 104857600
},
"errorLimit": {
"record": 10,
"percentage": 0.05
}
}
}
}
它由三部分组成,分别是读,写和通用配置。
Reader部分,也就是读,常用以下几种参数,如表2-3所示。
表2-3 读参数表
参数名 | 解释 | 备注 | 是否必须/默认值 |
---|---|---|---|
name | 与要读取的数据库一致 | name | |
jdbcUrl | 数据库链接 | 数组会自动选择一个合法的链接可以填写连接附件控制信息 | 是/无 |
username | 用户名 | 字符串,数据库的用户名 | 是/无 |
password | 密码 | 字符串,数据库的密码 | 是/无 |
table | 要同步的表名 | 数组,需保证表结构一致 | 是/无 |
column | 所配置的表中需要同步的列名集合,使用JSON的数组描述字段信息。用户使用代表默认使用所有列配置,例如['']。支持列裁剪,即列可以挑选部分列进行导出。<br/>支持列换序,即列可以不按照表schema信息进行导出。<br/>支持常量配置,用户需要按照Mysql SQL语法格式: ["id", "table ", "1", "'bazhen.csy'", "null", "to_char(a + 1)", "2.3" , "true"] id为普通列名,table 为包含保留在的列名,1为整形数字常量,'bazhen.csy'为字符串常量,null为空指针,to_char(a + 1)为表达式,2.3为浮点数,true为布尔值。 |
是/无 | |
where | 选取的条件 | 支持列裁剪,即列可以挑选部分列进行导出。字符串 | 否/无 |
querySql | 在有些业务场景下,where这一配置项不足以描述所筛选的条件,用户可以通过该配置型来自定义筛选SQL。当用户配置了这一项之后,DataX系统就会忽略table,column这些配置型,直接使用这个配置项的内容对数据进行筛选,例如需要进行多表join后同步数据,使用select a,b from table_a join table_b on table_a.id = table_b.id | 当用户配置querySql时,MysqlReader直接忽略table、column、where条件的配置 ,querySql优先级大于table、column、where选项。 |
否/无 |
Writer部分,也就是写,常用以下几种参数,如表2-4所示。
参数名 | 解释 | 备注 |
---|---|---|
name | 与要读取的数据库一致 | 字符串 |
jdbcUrl | 数据库链接 | 字符串不和writer一样可以填写连接附件控制信息 |
username | 用户名 | 字符串,数据库的用户名 |
password | 密码 | 字符串,数据库的密码 |
table | 要同步的表名 | 数组,需保证表结构一致 |
column | 要同步的列名 | 列名可以不对应,但是类型和总的个数要一致 |
preSql | 写入前执行的语句 | 数组,比如清空表等 |
postSql | 写入后执行的语句 | 数组 |
writeMode | 写入方式,默认为insert | insert/replace/update |
job.setting.speed(流量控制) Job支持用户对速度的自定义控制,channel的值可以控制同步时的并发数,byte的值可以控制同步时的速度 job.setting.errorLimit(脏数据控制) Job支持用户对于脏数据的自定义监控和告警,包括对脏数据最大记录数阈值(record值)或者脏数据占比阈值(percentage值),当Job传输过程出现的脏数据大于用户指定的数量/百分比,DataX Job报错退出。
执行
- 将上面的json文件放到/data/job目录下,然后
./bin/data.py ./job/test.json
然后通过脚本或者java程序定时执行之。
参考
来源:oschina
链接:https://my.oschina.net/112612/blog/3209030