天天看點

RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理

<a href="#1">1. innodb 引擎表行鎖等待和等待逾時發生的場景</a>

<a href="#2">2.innodb 引擎行鎖等待情況的處理</a>

<a href="#2.1">2.1 innodb 行鎖等待逾時參數 innodb_lock_wait_timeout</a>

<a href="#2.2">2.2 大量行鎖等待和行鎖等待逾時的處理</a>

當一個 rds for mysql 連接配接會話等待另外一個會話持有的互斥行鎖時,會發生 innodb 引擎表行鎖等待情況。

通常情況下,持有該互斥行鎖的會話(連接配接)會迅速的執行完相關操作并釋放掉持有的互斥鎖(事務送出或者復原),進而等待的會話在行鎖等待逾時時間到來前獲得該互斥行鎖,進行下一步操作。

但在某些情況下,比如一個執行個體未感覺到的來自用戶端應用的資料庫會話中斷,持有該互斥行鎖的會話長時間不釋放該互斥行鎖,此時如果有其他會話申請該互斥行鎖,則會導緻大量的行鎖等待與行鎖等待逾時。

本文提供的檢查和處理方法,僅當正在發生 innodb 行鎖等待的情況下才成立;因為 innodb 行鎖等待預設逾時時間為 50 秒,是以通常情況下不容易觀察到行鎖等待現場,可以通過将 innodb_lock_wait_timeout 參數設定為較大值來複現問題(生産環境不推薦使用過大的 innodb_lock_wait_timeout 參數值)。

#

參數

預設值

最小值

最大值

說明

1

innodb_lock_wait_timeout

50

1073741824

擷取innodb 行鎖的等待時間,機關秒。可在會話級别設定

該參數控制 innodb 行鎖等待的逾時時間,機關為秒,rds 執行個體該參數的預設值為 50(秒)。

等待互斥鎖的會話在等待 50 秒後會退出鎖等待狀态并傳回下面的錯誤,這個行為稱之為 innodb 引擎表行鎖等待逾時。

RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理

可以通過下面的指令檢視目前會話和全局的參數設定。

該參數支援在會話級别修改,友善應用在會話級别單獨設定某些特殊操作的行鎖等待逾時時間,如下:

RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理

如果行鎖等待和行鎖等待逾時持續發生,并且導緻目前應用運作異常,那麼需要擷取到一直持有行鎖的會話,并且終止該會話來釋放持有的鎖(會話對應的事務會復原)。

注:

下面的方法必須在行鎖等待正在發生的時候進行檢查。

方法 1: 通過 dms 

RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理

 執行個體資訊 

RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理

  innodb 鎖等待檢視,如下圖:

RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理

方法 2:通過 dms 

RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理
RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理

 執行個體會話檢視,如下圖

RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理

方法 3: 在 dms 無法登入的情況下,可以通過執行下面的查詢,獲得導緻行鎖等待和行鎖等待逾時的會話。

比如:

RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理

對于複雜的多個會話互相行鎖等待情況,建議先終止 role 為 blocker 且 trx_state 為 running 的會話;終止後再次檢查,如果仍舊有行鎖等待,再終止新結果中的 role 為 blocker 且 trx_state 為 running 的會話。 

對于辨別為 blocker 的會話(持有鎖阻塞其他會話的 dml 操作,導緻行鎖等待和行鎖等待逾時),确認業務可以接受其對應的事務復原的情況下,可以将其終止。

比如,可以通過 kill 指令來今後會話終止。

RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理RDS for MySQL InnoDB 行鎖等待和鎖等待逾時的處理

繼續閱讀