當數據庫發生故障時,如何快速定位問題并找到解決方案。特別是在非常重要的系統的運行和維護中,解決問題和恢復服務是分秒必爭。DB2作為廣泛使用的商業數據庫,內部提供了許多方法和診斷工具來協助分析問題。但是,當問題確實發生時,數據庫管理員仍然會很著急,不知道從哪里開始下手。如果在分析方向上發生錯誤,則會浪費更多的時間,并且無法及時解決問題。 甚至可能導致嚴重的后果。因此找出DB2數據庫擁塞的原因才是問題的關鍵。DB2數據庫中常見的堵塞問題有哪些?如何處理?
DB2數據庫常見堵塞問題
DB2數據庫發生性能緩慢或者堵塞的最常見現象是數據庫活動會話激增,數據庫相關命令和語句運行緩慢。導致性能緩慢的原因有很多,最常見的可能是出現鎖問題。一個長sql堵塞其他相關sql,導致短時間并發sql變多,系統變慢。也有可能是出現了大sql,耗盡系統資源等。如下圖所示,我歸納列舉了一些常見的堵塞原因,整理了相關問題解決的方法。
圖中所列的這些問題都可以通過DB2pd工具獲取信息來分析。我也在一鍵檢查分析工具里面包含了這些場景。
鎖鏈分析和處理
DB2的鎖機制與其他數據庫差異很大,鎖問題也是在數據庫運維中重點關注的對象。鎖是用來控制事務的一致性和并發性的。DB2的隔離級別和其他數據庫差不多,都是解決臟讀,幻讀,不可重復讀等問題。然而不同于其他數據庫,DB2的鎖是存放在內存里的。數據庫的locklist參數控制這個內存的大小。如果出現某個實務需要加的鎖特別多,可能會導致這個內存里放不下,觸發鎖升級。鎖升級更容易引起堵塞。
發現鎖堵塞
一個正常運行的數據庫突然出現鎖問題通常有兩種情況: 一種是運行了不常運行的SQL 事務,堵塞了正常的交易。一種是正常的交易事務突然性能有問題,例如查詢計劃改變。不管是哪種情況,最緊要的是將源頭找出來DB2top工具有一個非常好用的功能,就是查看鎖鏈的信息。
清單1.DB2top查看鎖鏈
在這個輸出里面,1546 這個應用是鎖的持有者,其他都是等待者。下一步就是分析1546在執行什么語句,是否需要殺,是否需要優化。
然而對于已經堵塞的DB2數據庫,DB2top可能根本打不開。這個時候就需要DB2pd工具來查看鎖等待的信息。
清單2. DB2pd 查看鎖等待
在這個 DB2pd 的輸出里面,第八列 Sts 就是持有者(G)和等待者(W)。第四列 lockname 是對應的鎖。需要綜合這兩個信息,才能知道應用的等待關系。這里分析鎖等待關系并不是非常直觀。所以我在開發的工具里結合 lockname 和鎖狀態信息組織出鎖鏈關系,然后展示出來。
分析鎖問題
基于上述信息,找到鎖的持有者源頭,現在還需要知道持有者在運行什么語句。這個可以通過DB2pd 的application選項和dynamic選項綜合分析出當前正在執行和上次執行的語句。
清單3. DB2pd 查看application
在DB2pd 工具的 application 輸出里面,C-AnchID和C-StmtUID結合起來指向當前正在運行的語句。L-AnchID和L-StmtUID結合起來指向上一次執行的語句。要獲得詳細的語句,需要從dynamic cache里找到。圖中C-AnchID和C-StmtUID都是0,也就是當前應用沒有執行任何語句。而L-AnchID和L-StmtUID是341和2,上一次執行的語句是可以獲取到的。
小結:導致數據庫堵塞的問題原因非常多,上述只是列舉了其中一小部分,想了解更多DB2數據庫的信息,請繼續關注中培偉業吧。