本文介紹如何使用DAS鎖分析功能對資料庫進行死結分析,包括最近死結分析和全量死結分析。
文中圖片所示中的資料為測試案例資料,實際使用過程中,請以實際資料參數為準,包括線程ID、SQL語句等。
前提條件
-
目標資料庫引擎為:
-
最近死結分析:
-
RDS MySQL
-
自建MySQL
-
PolarDB MySQL版
-
PolarDB-X 2.0
-
-
全量死結分析:
-
RDS MySQL
-
PolarDB MySQL版
-
-
-
目標資料庫執行個體已接入DAS,並且接入狀態顯示為接入正常,接入方法詳情請參見接入資料庫執行個體。
-
已開通DAS營運服務(原經濟版)。
重要-
DAS營運服務(原經濟版)目前僅支援部分地區,詳情請參見各個版本支援的資料庫和地區。
-
開通DAS營運服務(原經濟版)請參見管理營運服務(原經濟版)。
-
最近死結分析
-
參數設定:執行個體需開啟
innodb_deadlock_detect參數。說明該參數通常預設為開啟狀態,可通過執行
SHOW VARIABLES LIKE 'innodb_deadlock_detect'進行確認。需注意,部分類型的執行個體無法自行調整該參數的設定值。-
修改資料庫執行個體參數:
-
RDS MySQL請參見設定執行個體參數。
-
PolarDB MySQL版請參見設定叢集參數和節點參數。
-
-
-
分析資料:基於
SHOW ENGINE INNODB STATUS返回的最近一次死結日誌進行分析。
如果發生過多次死結,觸發分析時只能分析最近一次死結,然後保留本次分析得到的死結相關資料。
操作步驟
登入DAS控制台。
在左側導覽列中,單擊智能營運中心 > 執行個體監控。
找到目標執行個體,單擊執行個體ID,進入目標執行個體詳情頁。
-
在左側導覽列中,單擊鎖分析,在鎖分析頁面中死結分析項選擇最近死結分析頁簽。
-
點擊建立分析,發起最近死結診斷。
診斷完成後,在 最近死結分析 頁簽下的結果表格中,可查看診斷產生時間、發生時間及是否發現死結,單擊 查看詳情 可查看死結詳細資料。
查看詳情
-
選擇時間段,查看該時間段內曾經觸發過的死結診斷任務結果。
-
點擊最近死結分析中診斷工作清單詳情列中的查看詳情。
-
彈出的抽屜頁會顯示對應死結詳細資料的三種查看方式:
-
視圖:以死結關係可視化的形式展示死結詳情,點擊對應的事務圖塊可以在下方查看對應事務的詳細資料。視圖:以可視化圖形展示死結關係,包含參與死結的事務節點和Record Lock節點,通過lock granted和waiting箭頭展示鎖的持有與等待關係,形成死結環。已復原的事務會標註"已復原"。單擊事務節點可展開查看詳細資料,包括Session ID、Thread id、請求類型、事務ID、涉及表、等待鎖資訊及等待鎖索引名等欄位。
-
列表:以列表的形式,對比持有鎖事務的詳細資料。列表:以對比表格形式展示死結涉及的兩個事務詳情,左右兩列分別對應事務 1 和事務 2(已復原的事務會標註)。表格行包括 Session ID、Thread ID、請求類型、事務ID、涉及表、等待鎖(索引名及鎖類型,如 X locks rec but not gap waiting)、持有鎖(索引名及鎖類型)以及事務SQL。底部可通過線程ID或事務ID在SQL洞察中搜尋查看相關事務詳情。
-
日誌:展示
SHOW ENGINE INNODB STATUS返回的原始死結日誌(LATEST DETECTED DEADLOCK)內容。日誌:以原始日誌的形式展示 MySQL InnoDB 死結日誌詳情,包括死結發生時間、涉及事務的 SQL 陳述式、持有鎖資訊(HOLDS THE LOCK)及等待鎖資訊(WAITING FOR THIS LOCK TO BE GRANTED)等。
-
結合SQL洞察和審計分析
-
在目標執行個體左側導覽列中,單擊SQL洞察和審計,在審計頁面點擊開啟進階查詢。
-
選擇包含死結發生時間的一段時間範圍,並填入線程ID(最近死結分析中的Thread id),查詢該事務執行過的SQL內容。
-
如上述樣本中的事務1,查詢結果顯示該線程執行了三條SQL:
update students set name=UUID() where id = 2(執行時間2938.377毫秒,鎖等待時間1毫秒)、update students set name=UUID() where id = 3(執行時間0.002毫秒)以及begin。其中第一條update語句執行耗時異常,表明存在鎖等待。 -
上述樣本中的事務2(已復原):在審計頁面,設定時間範圍並將線程ID設為
195662,單擊查詢。日誌列表顯示事務2的SQL執行記錄:update students set name=UUID() where id = 3狀態為失敗(錯誤碼1213,即死結),耗時1.40 ms,鎖等待時間1.152 ms;update students set name=UUID() where id = 2執行成功,耗時0.20 ms;begin執行成功,耗時0.18 ms。
-
全量死結分析
-
參數設定:執行個體需開啟
innodb_deadlock_detect、innodb_print_all_deadlocks參數。RDS MySQL執行個體需將log_error_verbosity參數值設定為3。說明參數
innodb_deadlock_detect通常預設為開啟狀態,可通過執行SHOW VARIABLES LIKE 'innodb_deadlock_detect'進行確認。需注意,部分類型的執行個體無法自行調整該參數的設定值。-
修改資料庫執行個體參數:
-
RDS MySQL請參見設定執行個體參數。
-
PolarDB MySQL版請參見設定叢集參數和節點參數。
-
-
-
分析資料:每小時解析執行個體錯誤記錄檔中列印的死結資訊,統計死結數量趨勢以及各個死結的詳細資料。
-
冷卻時間:當執行個體開啟DAS營運服務(原經濟版),識別到未開啟所需參數時,會冷卻12小時不進行分析。如果使用者在冷卻時間內開啟了所需參數,也將在冷卻時間後再次調度分析任務。例如:
-
執行個體11點12分的分析任務檢測到參數未開啟,將進行12小時的定時任務冷卻,23點12分後全量死結分析將再次調度該執行個體定時任務,如果執行個體參數仍未開啟,將繼續進行12小時的定時任務冷卻;如果執行個體在23點12分之前開啟了參數,在23點12分後將解除冷卻,定時任務將每小時進行分析,直到執行個體關閉參數或關閉DAS營運服務(原經濟版)。
-
不支援分析包含“TOO DEEP OR LONG SEARCH IN THE LOCK TABLE WAITS-FOR GRAPH, WE WILL ROLL BACK FOLLOWING TRANSACTION”描述的死結。
操作步驟
登入DAS控制台。
在左側導覽列中,單擊智能營運中心 > 執行個體監控。
找到目標執行個體,單擊執行個體ID,進入目標執行個體詳情頁。
-
在左側導覽列中,單擊鎖分析,在鎖分析頁面中死結分析項選擇全量死結分析頁簽。
-
全量死結分析每小時自動分析執行個體錯誤記錄檔中列印的死結日誌,統計死結數量並繪製為頁面上方的死結變化趨勢圖。選擇時間段,查看該時間段內的死結變化趨勢。
頁面上方提供近1天、近3天、近1周快捷按鈕及自訂日期範圍選取器,單擊查看按鈕重新整理趨勢圖。趨勢圖下方為死結事件列表,展示每條死結發生時間,單擊對應的查看詳情可查看該死結的詳細資料。
查看詳情
-
點擊全量死結分析中死結列表詳情列的查看詳情。
-
彈出的抽屜頁會顯示對應死結詳細資料的三種查看方式(視圖、列表、日誌),其中,日誌內容為死結相關的錯誤記錄檔。視圖、列表展示形式與最近死結分析一致,此處不再贅述,詳情請參見最近死結分析-查看詳情。
結合SQL洞察和審計分析
與最近死結分析一致,此處不再贅述,詳情請參見最近死結分析-結合SQL洞察和審計分析。