天天看點

資料內建通過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日志