本文介紹如何通過鎖阻塞統計頁面快速定位造成長時間阻塞的會話及其詳細資料。
前提條件
執行個體的儲存類型為雲端硬碟。
執行個體不能是RDS SQL Server 2008 R2雲端硬碟版。
背景資訊
在SQL Server中,為了保持資料的一致性,當某個會話對特定資源進行修改時,系統會對該資源加鎖,避免其他並發會話對同個資源進行訪問或修改。正常情況下,該鎖的期間較短,修改結束後即會被釋放,以允許下一個會話繼續訪問該資源。但是當存在慢SQL或者其他異常時,可能會導致資源被長時間鎖定,嚴重影響效能。
為解決上述問題,RDS提供了鎖阻塞統計頁面。通過查看該頁面,可快速定位到阻塞源的SPID(會話ID)、阻塞發生的時間、引發阻塞的SQL語句等資訊,便於精準定位問題。
採樣原理
通常,單個會話阻塞2秒左右不會有太大問題,但短期內連續出現多個會話阻塞超過2秒的情況就會對整個系統產生顯著影響。
系統每10秒會對鎖阻塞的情況進行一次採樣,在系統進行採樣的時間點,只要當一個會話執行SQL時間超過2秒、並且阻塞了其他會話的執行,就會被捕捉並統計到鎖阻塞統計頁面。
操作步驟
- 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側導覽列,選擇自治服務(原CloudDBA) > 锁优化。
單擊鎖阻塞頁簽,即可查詢執行個體中的阻塞詳情。
頁面介紹
阻塞數量概覽
可分時段查看到近期產生的阻塞數量。
阻塞時間長度趨勢圖
以阻塞持續的時間長度為基準,展示某個時間段內阻塞時間長度的變化趨勢。
將滑鼠移動到特定的時間點,可查詢該時間點阻塞發生的詳情。包含如下內容:
阻塞發生的時間。
Processes_blocked:被阻塞的會話數量。
Uncommited_tran:未被提交的事務數量。
說明鎖不被釋放的原因,即事務未被提交。
QueryHash(特定SQL語句的Hash值)和對應阻塞時間。
阻塞來源詳細資料
展示阻塞源的詳細資料,包含如下內容:
Spid:阻塞源的會話ID。
QueryHash:將SQL語句進行Hash之後得出的值,同一種SQL對應同一個QueryHash。
等待類型:展示當前等待中的會話被阻塞的原因。更多等待類型及說明,請參見等待類型。
執行時間(ms):會話持續執行的時間長度。
SQL:導致阻塞發生的SQL語句。
說明將滑鼠移動到SQL語句上,在SQL語句的右邊會出現表徵圖,單擊該表徵圖即可複製該SQL語句。
時間:阻塞發生的時間。
資料庫名:發生阻塞的資料庫名稱。
單擊某一行的任意位置,可在頁面下方查看該行對應的阻塞關係圖。
阻塞關係圖
展示阻塞的會話ID(紅色)和被阻塞的會話ID(藍色),以及鎖的類型和阻塞的時間長度。更多鎖類型及說明,請參見鎖類型。
將滑鼠移動到會話ID上可以查看阻塞詳情,包含如下內容:
SPID:會話ID。
BlockedBySpid:阻塞中的會話ID。
WaitType:等待類型。
WaitTimeMs:阻塞時間長度。單位:ms。
CMD:當前會話的SQL命令類型。
CPU:CPU時間。單位:ms。
DBName:資料庫名稱。
ClientAppName:用戶端名稱。
HostName:用戶端主機名稱。
LoginId:登入使用者名稱。
PhysicalIO:當前會話執行SQL消耗的I/O。1個PhysicalIO=8KB。
QueryHash:將SQL語句進行Hash之後得出的值,同一種SQL對應同一個QueryHash。
StartTime:當前Batch開始執行的時間。一個Batch中可以包含多個SQL,共用變數值等資源。
Status:當前執行個體狀態。
SQL:單擊紅色或藍色的會話ID,會在阻塞關係圖下方顯示SQL的執行詳情。
SQL詳情
在阻塞關係圖中,單擊紅色或藍色的會話ID,便會顯示會話的SQL執行詳情,單擊下方的點擊複製可快速複製SQL語句,方便排查或回溯有問題SQL。