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