dataxmysqlreplace_DataX-MysqlWriter插件⽂档
DataX MysqlWriter
1 快速介绍
MysqlWriter 插件实现了写⼊数据到 Mysql 主库的⽬的表的功能。在底层实现上, MysqlWriter 通过 JDBC 连接远程 Mysql 数据库,并执⾏相应的 insert into ... 或者 ( replace into ...) 的 sql 语句将数据写⼊ Mysql,内部会分批次提交⼊库,需要数据库本⾝采⽤ innodb 引擎。
MysqlWriter ⾯向ETL开发⼯程师,他们使⽤ MysqlWriter 从数仓导⼊数据到 Mysql。同时 MysqlWriter 亦可以作为数据迁移⼯具为DBA等⽤户提供服务。
2 实现原理
MysqlWriter 通过 DataX 框架获取 Reader ⽣成的协议数据,根据你配置的 writeMode ⽣成
(当主键/唯⼀性索引冲突时会写不进去冲突的⾏)
或者
(没有遇到主键/唯⼀性索引冲突时,与 insert into ⾏为⼀致,冲突时会⽤新⾏替换原有⾏所有字段) 的语句写⼊数据到Mysql。出于性能考虑,采⽤了 PreparedStatement + Batch,并且设置了:rewriteBatchedStatements=true,将数据缓冲到线程上下⽂ Buffer 中,当 Buffer 累计到预定阈值时,才发起写⼊请求。
注意:⽬的表所在数据库必须是主库才能写⼊数据;整个任务⾄少需要具备 insert/的权限,是否需要其他权限,取决于你任务配置中在 preSql 和 postSql 中指定的语句。
3 功能说明
3.1 配置样例
这⾥使⽤⼀份从内存产⽣到 Mysql 导⼊的数据。
{
"job": {
"setting": {
"speed": {
"channel": 1
}
},
"content": [
{
"reader": {
"name": "streamreader",
"parameter": {
"column" : [
{
"value": "DataX",
"type": "string"
},
{
"value": 19880808,
"type": "long"
},
{
"value": "1988-08-08 08:08:08", "type": "date"
},
{
"value": true,
"type": "bool"
},
{
"value": "test",
"type": "bytes"
}
],
mysql帮助文档"sliceRecordCount": 1000
}
},
"writer": {
"name": "mysqlwriter", "parameter": {
"writeMode": "insert", "username": "root", "password": "root",
"column": [
"id",
"name"
],
"session": [
"set session sql_mode=‘ANSI‘" ],
"preSql": [
"delete from test"
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://127.0.0.1:3306/datax?useUnicode=true&characterEncoding=gbk",
"table": [
"test"
]
}
]
}
}
}
]
}
}
3.2 参数说明
jdbcUrl
描述:⽬的数据库的 JDBC 连接信息。作业运⾏时,DataX 会在你提供的 jdbcUrl 后⾯追加如下属性:
yearIsDateType=false&zeroDateTimeBehavior=convertToNull&rewriteBatchedStatements=true
注意:1、在⼀个数据库上只能配置⼀个 jdbcUrl 值。这与 MysqlReader ⽀持多个备库探测不同,因为此处不⽀持同⼀个数据库存在多个主库的情况(双主导⼊数据情况)
2、jdbcUrl按照Mysql官⽅规范,并可以填写连接附加控制信息,⽐如想指定连接编码为 gbk ,则在 jdbcUrl 后⾯追加属性
useUnicode=true&characterEncoding=gbk。具体请参看 Mysql官⽅⽂档或者咨询对应 DBA。
必选:是
默认值:⽆
username
描述:⽬的数据库的⽤户名
必选:是
默认值:⽆
password
描述:⽬的数据库的密码
必选:是
默认值:⽆
描述:⽬的表的表名称。⽀持写⼊⼀个或者多个表。当配置为多张表时,必须确保所有表结构保持⼀致。
注意:table 和 jdbcUrl 必须包含在connection配置单元中
必选:是
默认值:⽆
column
描述:⽬的表需要写⼊数据的字段,字段之间⽤英⽂逗号分隔。例如: "column": ["id","name","age"]。如果要依次写⼊全部列,使⽤表⽰, 例如: "column": [""]。
**column配置项必须指定,不能留空!**
注意:1、我们强烈不推荐你这样配置,因为当你⽬的表字段个数、类型等有改动时,你的任务可能运⾏不正确或者失败
2、 column 不能配置任何常量值
必选:是
默认值:否
session
描述: DataX在获取Mysql连接时,执⾏session指定的SQL语句,修改当前connection session属性
必须: 否
默认值: 空
preSql
描述:写⼊数据到⽬的表前,会先执⾏这⾥的标准语句。如果 Sql 中有你需要操作到的表名称,请使⽤ @table 表⽰,这样在实际执⾏ Sql 语句时,会对变量按照实际表名称进⾏替换。⽐如你的任务是要写⼊到⽬的端的100个同构分表(表名称为:datax_00,datax01, ...
datax_98,datax_99),并且你希望导⼊数据前,先对表中数据进⾏删除操作,那么你可以这样配置:"preSql":["delete from 表名"],效果是:在执⾏到每个表写⼊数据前,会先执⾏对应的 delete from 对应表名称
必选:否
默认值:⽆
postSql
描述:写⼊数据到⽬的表后,会执⾏这⾥的标准语句。(原理同 preSql )
必选:否
默认值:⽆
writeMode
描述:控制写⼊数据到⽬标表采⽤ insert into 或者 replace into 或者 ON DUPLICATE KEY UPDATE 语句
必选:是
所有选项:insert/replace/update
默认值:insert
batchSize
描述:⼀次性批量提交的记录数⼤⼩,该值可以极⼤减少DataX与Mysql的⽹络交互次数,并提升整体吞吐量。但是该值设置过⼤可能会造成DataX运⾏进程OOM情况。
默认值:1024
3.3 类型转换
类似 MysqlReader ,⽬前 MysqlWriter ⽀持⼤部分 Mysql 类型,但也存在部分个别类型没有⽀持的情况,请注意检查你的类型。下⾯列出 MysqlWriter 针对 Mysql 类型转换列表:
DataX 内部类型Mysql 数据类型
Long
int, tinyint, smallint, mediumint, int, bigint, year
Double
float, double, decimal
String
varchar, char, tinytext, text, mediumtext, longtext
Date
date, datetime, timestamp, time
Boolean
bit, bool
Bytes
tinyblob, mediumblob, blob, longblob, varbinary
bit类型⽬前是未定义类型转换
4 性能报告
4.1 环境准备
4.1.1 数据特征
建表语句:
CREATE TABLE `datax_mysqlwriter_perf_00` (
`biz_order_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘id‘,
`key_value` varchar(4000) NOT NULL COMMENT ‘Key-value的内容‘,
`gmt_create` datetime NOT NULL COMMENT ‘创建时间‘,
`gmt_modified` datetime NOT NULL COMMENT ‘修改时间‘,
`attribute_cc` int(11) DEFAULT NULL COMMENT ‘防⽌并发修改的标志‘,
`value_type` int(11) NOT NULL DEFAULT ‘0‘ COMMENT ‘类型‘,
`buyer_id` bigint(20) DEFAULT NULL COMMENT ‘buyerid‘,
`seller_id` bigint(20) DEFAULT NULL COMMENT ‘seller_id‘,
PRIMARY KEY (`biz_order_id`,`value_type`),
KEY `idx_biz_vertical_gmtmodified` (`gmt_modified`)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论