mysql做表結構變動的時候遇到的Duplicate entry錯誤

組內小夥伴問我:erge,我這個表查了只有一條記錄,怎麼在改表結構的時候會報重複。

我一聽,恩,心裏就有數了(沒他,見的多了,用的多了,寫的多了,碰到的多了,踩的坑多)

我給他講有以下幾點原因,還有其他原因請不吝賜教

  • mysql 5.6之後 online DDL引起的(大白話原理在最後)

    解決方案:

    • 鎖表
    	# 執行前鎖表 儘量在業務低峯期操作
    	LOCK TABLES my_table WRITE;
    	ALTER ...;
    	UNLOCK TABLES;
    
    • 用第三方工具pt-online-schema-change等
  • 觸發器之類的關聯其他表操作

    解決方案:

    • 查看對應的觸發器關聯的表處理
  • 可能備份中出現問題

    解決方案:

    • 修復下表
  • id達到最大值

    解決方案:

    • 這個還要說

表數據較多,在執行alter table期間有其他會話執行了造成duplicate entry的語句使online ddl在執行完結構變更回放緩存的時候報錯。 Oline DDL的原理簡單一點理解就是將DML操作緩存起來,等到DDL執行完成後重新應用緩存中的DML語句,如果在Oline DDL執行過程中,DML操作產生了Duplicate entry錯誤,並不會直接影響DDL操作,而是在DDL執行完成最終應用DML時報錯,導致DDL執行失敗。官方認爲該問題是一種限制,並不是Bug,所以目前爲止還沒有得到解決。 只有在唯一鍵衝突的時候(insert,update)纔會影響到DDL,主鍵衝突沒有影響。

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