問題現象
在使用RDS MySQL的過程中,備執行個體或唯讀執行個體出現複製中斷,提示如下錯誤:
[ERROR] [MY-010584] [Repl] Slave SQL for channel '': Worker 1 failed executing transaction 'XXX' at master log mysql-bin.XXX, end_log_pos XXX; Could not execute Write_rows_v1 event on table XXX.XXX; Duplicate entry 'XXX' for key 'xxx.xxx', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.XXX, end_log_pos XXX, Error_code: MY-001062可能原因
將unique_checks設定為0時,可能造成上述錯誤。
unique_checks參數的取值含義:
1:RDS MySQL會對InnoDB表中的唯一鍵進行唯一性檢查。
0:如果DML語句操作的資料不在buffer pool中,那麼RDS MySQL不會通過讀取磁碟上的主鍵和唯一鍵來對InnoDB表中的二級索引進行唯一性檢查。此時,可以插入重複的唯一鍵。
當在主執行個體上,設定unique_checks為0時,如果DML語句操作的資料不在buffer pool中,那麼RDS MySQL不會通過讀取磁碟上的主鍵和唯一鍵來對InnoDB表中的二級索引進行唯一性檢查,此時主執行個體將成功插入重複的唯一鍵。而在備執行個體上,設定unique_checks為0時,如果DML語句操作的資料存在於buffer pool中,RDS MySQL將會對DML語句所操作的二級索引進行唯一性檢查,此時不允許插入重複的唯一鍵,從而發生複製中斷。詳情請參見MySQL官方Bug#106121。
解決方案
如果您確定插入的資料不會產生唯一鍵衝突,那麼可以設定unique_checks為0,以加快資料的匯入速度。
如果您不確定插入的資料是否會產生唯一鍵衝突,那麼請設定unique_checks為1。