天天看点

数据集成通过JDBC将数据导入MySQL的几种模式

目前mysql jdbc提供了多种将数据写入mysql的方式,本文将介绍数据集成(datax、同步中心、原cdp)支持的几种模式:

insert into xxx values (..), (..), (..)

replace into xxx values (..), (..), (..)

insert into xxx values (..), (..), (..), … on duplicate key update …

常规的sql插入,如果提交的mysql server端的数据违反了数据库约束(主键冲突、数据类型不匹配)会直接报错;

对应在数据集成中会报脏数据。 常用于向一张空表里面插入数据;

与insert into类似,区别:假如将要插入表新记录中主键(primarykey或unique索引)与表中旧记录冲突,replace into自身具有处理冲突的能力:

1、当存在pk冲突的时候是先delete再insert

2、当存在uk冲突的时候是直接update

使用replace into 注意事项

1、能够使用replace,您必须同时拥有表的insert和delete权限;

2、冲突记录:新记录与旧记录的主键值不同,所以其他表中所有与本表老数据主键id建立的关联全部会被破坏;

3、冲突记录:所有列的值均取自在热replace语句中被指定的值。所有缺失的列被设置为各自的默认值,即如果您每次同步的不是表的所有列,会存在一些列在旧记录中有值,replace into后无值的情况;

4、replace语句会返回一个数,来指示受影响的行的数目。该数是被删除和被插入的行数的和。

将要插入表新记录中主键(primarykey或unique索引)与表中旧记录冲突(具有相同的值),则update旧记录。

如果库存在主备,基于uk去做replace into时,会造成主备的auto_increment不一致(备库因auto_increment小于实际数据的最大值),在主备切换插入时造成replace into出错,失败一次后,会更新auto_increment为最大值+1;

插入完成后,主库和备库数据和schema完全一致;执行replace into:

主备库数据一致,但是schema不一致。

原因分析:

如第一章节所述:

replace into 当存在uk冲突的时候是直接update,update操作不会涉及到auto_increment的修改。

基于此,一些replace操作会被建议使用insert into on duplicate key update。

目前数据集成对于上述三种模式均已经支持,对应datax mysqlwriter插件配置项中writemode字段;

简单解释 幂等性 :多次运行同一个同步作业得到的结果是一致的;

场景一:表中数据可以删除

在数据集成配置同步任务时,配置前置sql(delete or truncate表的语句),同步任务在每次执行的时候,在真正同步执行前会执行前置sql,去清空表,这样即可以实现多次运行同步任务的幂等性。

场景二:表中数据不能删除,常见回流线上业务mysql库

配置writemode为 replace 或者 update,同步的时候即会采用replace into 或者 insert into… on duplicate key update 方式插入mysql数据库。

参考:

<a href="https://askdba.alibaba-inc.com/libary/control/getarticle.do?articleid=12735">https://askdba.alibaba-inc.com/libary/control/getarticle.do?articleid=12735</a>

<a href="https://blog.xupeng.me/2013/10/11/mysql-replace-into-trap/">https://blog.xupeng.me/2013/10/11/mysql-replace-into-trap/</a>

下一篇: PLM日志