mysql auto_increment 的坑

  • Statement-Based Replication,不要設置innodb_autoinc_lock_mode=2 會導致主從數據不一致
innodb_autoinc_lock_mode=2 時,auto_inc鎖順序:
0)   開始語句執行:
1)   申請AUTO_INC鎖
2)   得到當前AUTO_INCREMNT值n,給AUTO_INCREMENT 加1
3)   釋放AUTO_INC鎖
4)   插入一條記錄
5)   併發的重複執行1,2,3,4
6)   語句結束

insert模式
insert like
所有的插入語句範式
INSERT, INSERT … SELECT, REPLACE, REPLACE … SELECT, and LOAD DATA, INSERT … VALUES(),VALUES()
包括simple inserts, bulk inserts, mixed-mode inserts
Simple inserts
可以確定插入記錄條數
INSERT, INSERT … VALUES(),VALUES()
Bulk inserts
不可以確定插入記錄條數
INSERT … SELECT
REPLACE … SELECT
LOAD DATA
Mixed-mode inserts
不確定是否分配auto_increment_id
INSERT INTO t1 (c1,c2) VALUES (1,’a'), (NULL,’b'), (5,’c'), (NULL,’d');
INSERT … ON DUPLICATE KEY UPDATE

對於Bulk inserts 和 Mixed-mode inserts (比如:INSERT INTO t1 (c1,c2) VALUES (1,’a'), (NULL,’b'), (5,’c'), (NULL,’d');  和load file語句) auto_increment的列的值是不連續的,而且主備上值在併發環境下可能是不一致的。

  • replace into 語句坑
產生條件
1.主鍵是auto_increment 
2.有另一unique key 的唯一鍵
3.通過replace into 更新唯一鍵的值
4.表中存在repalce into 中指定的唯一鍵的記錄
5.主機和備機採用row模式複製
行爲:原因是:主機執行的是delete+insert語句,備機執行的是update語句
結果是:備機的auto_increment的值比主機小1, 主備發生切換後導致鍵值衝突
    解決辦法:使用nsert into table values(,....) on duplicate key update 替換

  • InnoDB 自增列出現重複值
原因
AUTO_INCREMENT是實時存儲內存中
mysqld 重啓後行類似select max(id)+1 from t1;方法來得到AUTO_INCREMENT
產生場景
如果mysql在重啓前遷移部分數據到歷史庫
重啓後mysql 會重用auton_increment的值
再次遷移數據到歷史庫會導致數據庫記錄重複出現
解決辦法
每次遷移的歷史數據存放在不同的庫表
歷史庫字段去掉auto_increment屬性
採用replace into 方式導入



參考:
http://www.kancloud.cn/taobaomysql/monthly/67160
https://blog.xupeng.me/2013/10/11/mysql-replace-into-trap/
http://blog.csdn.net/jiao_fuyou/article/details/46485631







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章