percona系列~pt-osc導致的死鎖

一 現象
    數據庫運維平臺執行DDL操作導致了死鎖問題
二 死鎖日誌關鍵點
   1 事務包含語句 replace into (更新操作)
   2 事務等待鎖 lock mode AUTO-INC waiting
三 過程執行語句
   1 pt-osc INSERT LOW_PRIORITY IGNORE INTO
     持有 AUTO-INC 鎖 申請 主鍵行鎖(x)
  2 觸發器 replace into
    持有 主鍵行鎖(x) 等待 auto-inc鎖
    可以發現 互相等待形成死鎖
四 分析
  1 replace into 加鎖方式
    會對主鍵相關記錄加X鎖,針對衝突的記錄,會執行delete+insert操作.後續申請auto-inc鎖
  2 insert into 加鎖方式
   1 申請 auto-inc(表級鎖) 加鎖 2 釋放auto-inc加鎖 3 獲取 INSERT INTENTION LOCK(插入意向鎖) 4 存在衝突,針對衝突主鍵添加S鎖,最後針對行獲取X鎖
四 解決方法
  1  設置pt-osc的chunk-size爲更小的值 可以減少死鎖的發生,但是不可能避免死鎖的發生。
  2  innodb_autoinc_lock_mode的值爲2
  3  mysql版本爲8.0.18以上版本
 4   其本質還是由於觸發器的replace into語句導致的

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