當表同時擁有 自增主鍵 與 唯一鍵,且使用 REPLACE INTO 處理唯一鍵衝突時,主庫與備庫的 AUTO_INCREMENT 計數器會發生偏移,主從切換瞬間引發資料覆蓋或主鍵衝突。
CREATE TABLE t1 (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20),
UNIQUE KEY uk_name (name)
) ENGINE=InnoDB;
主備 AUTO_INCREMENT=2,插入 ('a') → id=1。
REPLACE INTO t1(name) VALUES('a'); -- UK 衝突,UPDATE id=1,AUTO_INCREMENT→3
REPLACE INTO t1(name) VALUES('a'); -- 再次 UPDATE,AUTO_INCREMENT→4
主庫狀態:id=3, name='a',AUTO_INCREMENT=4
備庫應用 binlog(記錄為 UPDATE),AUTO_INCREMENT 維持 2 不變,資料行 id=3 同步成功。
關鍵差異:主庫 AUTO_INCREMENT=4,備庫 AUTO_INCREMENT=2。
備庫升為新主庫,業務繼續執行 REPLACE INTO t1(name) VALUES('a'):
AUTO_INCREMENT=2 分配 IDid=3 改為 id=2若表中有多行資料,後續寫入更會引發主鍵衝突錯誤,導致寫入失敗。
REPLACE INTO 處理 UK 衝突時執行的是 UPDATE,但自增計數器在「DELETE+INSERT」邏輯中才會推進。binlog 記錄為 UPDATE 不會推進備庫計數器,導致主備計數器偏移。
INSERT INTO t1(name) VALUES('a')
ON DUPLICATE KEY UPDATE name=VALUES(name);

INSERT ... ON DUPLICATE KEY UPDATE