鎖簡介
鎖定義
DB2 通過使用鎖 把事務彼此隔離開來。鎖是一種用來將數據資源與單個事務關聯起來的機制,其用途是當某個資源與擁有它的事務關聯在一起時,控制其他事務如何與該資源進行交互。(我們稱與被鎖定的資源關聯的事務持有 或擁有 該鎖)DB2 數據庫管理程序用鎖來禁止事務訪問其他事務寫入的未提交數據(除非使用了未提交的讀隔離級別),並禁止其他事務在擁有鎖的事務使用限制性隔離級別時對這些行進行更新。一旦獲取了鎖,在事務終止之前,就一直持有該鎖;該事務終止時釋放鎖,其他事務就可以使用被解鎖的數據資源了。
死鎖
盡管可以通過建立鎖超時來避免一個事務無限期地等待另一個事務釋放鎖的情況,但是鎖超時無法解決兩個或更多事務對鎖的爭用。這種情況稱為死鎖 或死鎖循環。說明死鎖的發生原因的最佳方式是舉例說明:假定事務 1 在表 A 上獲取了互斥(X)鎖,而事務 2 在表 B 上獲取了互斥(X)鎖。現在,假定事務 1 嘗試在表 B 上獲取互斥(X)鎖,而事務 2 嘗試在表 A 上獲取互斥(X)鎖。這兩個事務的處理都將被掛起,直到同意第二個鎖請求為止。但是,因為在任何一個事務釋放它目前持有的鎖(通過執行或回滾操作)之前,這兩個事務的鎖請求都不會被同意,而且因為這兩個事務都不能釋放它目前持有的鎖(因為它們都已掛起並等待鎖),所以它們都陷入了死鎖循環。當死鎖循環發生時,除非某些外部代理進行干涉,否則所涉及的所有事務將無限期地等待釋放鎖。在 DB2 UDB 中,用於處理死鎖的代理是稱為死鎖檢測器 的異步系統後台進程。死鎖檢測器的惟一職責是定位和解決在鎖定子系統中找到的任何死鎖。通過本文就可以了解到, 如何通過 OPM 快速的定位,解決死鎖問題。
鎖超時及鎖等待
每當一個事務在特定數據資源(例如,表或行)上持有鎖時,直到持有鎖的事務終止並釋放它所獲取的所有鎖之前,其他事務對該資源的訪問都可能被拒絕。如果沒有某種鎖超時檢測機制,則事務可能無限期地等待鎖的釋放。這種情況就叫鎖等待,例如,有可能出現這種情況:一個事務在等待另一個用戶的應用程序所持有的鎖被釋放,而該用戶離開了他或她的工作站,但忘了執行一些允許應用程序終止擁有鎖的事務的交互。顯然,此類情況會導致極差的應用程序性能。要避免發生此類情況時阻礙其他應用程序的執行,可以在數據庫的配置文件中指定鎖超時值(通過 locktimeout 數據庫配置參數)。該參數控制任何事務等待獲取所請求的鎖的時間。如果在指定的時間間隔過去之後還未獲得想要的鎖,則等待的應用程序接收一個錯誤,並回滾請求該鎖的事務。但是,在沒有設定鎖超時的情況下或者未到鎖超時時間限定范圍內,我們如何知道已經造成了鎖等待?又如何去解決呢?本文將介紹如何通過 OPM 去解決這些問題。
IBM Optim Performance Manager for DB2 簡介
IBM Optim (原 Data Studio)軟件家族作為 IBM 軟件產品組合的新成員,有效集成了數據庫應用程序的設計、開發、部署、操作、優化、治理這幾個數據生命周期階段,並實現不同 IT 角色之間的統籌協作。在為應用程序和工作負載進行前攝性的規劃和優化領域,Optim 家族提供了 Optim Query Tuner、Optim Performance Manager、Optim pureQuery Runtime 等調優工具。而 Optim Performance Manager,簡稱 OPM, 其前身是 Optim Performance Expert。在數據管理生命周期中處於以下位置:
圖 1. 軟件生命周期
OPM 是一款基於 Web 開發的數據庫性能監控工具,同時作為一款 B/S 產品,OPM 具有非常強的可操作性。具備以下功能:
對多個 DB2 實例進行統一的監控;
對 DB2 引擎和應用的監控;
分析和控制,提供實時及歷史數據;
可讀性強的圖表;
多分區上的性能管理;
集成對操作系統的監控;
集成對操作系統的監控;
監控資源消耗 ,SQL 語句及事務 , 鎖沖突等。
使用 OPM 得到完整的 DB、應用程序鎖警告信息
添加被監控數據庫
首先,打開 OPM 監控主頁,並切換到管理數據庫連接界面。如圖 2 所示:
圖 2. OPM 數據庫管理連接
查看原圖(大圖)
點擊“添加(Add …)”按鈕,輸入用戶驗證信息,在彈出的界面中設置添加需要監控的數據庫(本文以數據庫 GSDB 為例)即可,點擊“確定(OK)”後,被監控數據庫(GSDB)即被添加到 OPM 監控數據庫,如下圖所示:
圖 3. 添加數據庫連接
查看原圖(大圖)
設置鎖監控
數據庫添加成功後,需要設置監控項目,OPM 按照攝制的選項對數據庫性能進行監控。切換到圖 2 所示的數據庫管理連接界面,進行設置,選中要監控數據庫的節點,點擊“配置監視 (Configure Monitoring … )”如圖 4 所示:
圖 4. 配置監視
查看原圖(大圖)
選擇想要監控的項目,如圖 5 所示:
圖 5. 配置監視概要文件
查看原圖(大圖)
從“任務管理器(Task Manager)”—〉“正在運行的儀表板(Inflight Dashboards)”—〉“鎖定(Locking)”,切換到鎖界面,選擇監控數據庫,然後點擊“更改配置(Change Configuration)”,開啟“啟用死鎖警報(Enable deadlock alert)”。
圖 6. 啟用死鎖警報
從警報界面分析鎖信息
在設置生效後,OPM 會監控所設置數據庫,以及其應用程序中的鎖信息,一旦有鎖的問題就會寫入數據庫監控信息。首先從 OPM 警報(Alert)界面進行分析。
圖 7. 警報界面的鎖信息
查看原圖(大圖)
從這個界面我們可以看到所有被監控數據庫的所有時間段所發生的死鎖,包括鎖得發生時間。選中其中一條記錄,就可以看到所得更為詳盡的信息,包括使用者,應用程序,IP 地址等。警報界面還提供了送郵件功能從“配置 (Configure)”按鈕設置接受郵件地址,即可在相應郵箱及時地收到問題報告。在警報界面只給出了一個籠統的信息,要想詳細分析鎖信息還需要切換到鎖界面。
從鎖界面分析鎖信息
通過點擊圖 7 中“鎖定儀表盤(Locking Dashboard)”或者從“任務管理器(Task Manager)”—〉“正在運行的儀表板(Inflight Dashboards)”—〉“鎖定(Locking)”進入鎖界面。
圖 8. 鎖界面縱覽鎖信息
查看原圖(大圖)
從圖 8,可以看到按分 2 大部分,一部分是數據庫信息,一部分是鎖信息。縱覽可以看到死鎖的總數量,鎖事件,鎖等待等信息。下面分別詳述。
圖 9. 數據庫鎖信息
查看原圖(大圖)
數據庫信息部分按照用戶信息 ID、應用程序名、主機名和應用程序類型來分類。每一類展開都會顯示詳細的項目信息。此處一目了然的可以看到 test1 用戶在執行 product VIEwing 這個操作的時候產生了 3 個死鎖。同時也可以看到這是一個 WAS 的應用程序,執行在 IP 地址為 9.181.142.50 的客戶端上。
圖 10. 數據庫 (GSDB) 的鎖信息
查看原圖(大圖)
圖 10 列出了所有的鎖事件,包括問題的嚴重程度,此處是 Problem 。
使用 OPM 分析、定位死鎖問題
通過上面的數據庫,應用程序整體信息,現在來詳細分析死鎖的問題。從圖 10 中選中其中一條記錄,通過點擊“分析(Analyze … )”按鈕查看分析詳細的死鎖信息。
圖 11. 鎖概況
查看原圖(大圖)
圖 11 是死鎖的一個概括信息,顯示出了數據庫版本信息,鎖警告時間,應用程序 ID 等信息。
圖 12. 參與者鎖信息 -1
查看原圖(大圖)
選擇“顯示 / 高亮不同(Show/highlight differences )”、“語句(Statement )”、“鎖(Locks )”、“應用(Application )”、“表(Table )”,圖 12 中 OPM 在同一頁面中以對比模式清晰地展示了不同的參與者的以下信息:
參與類型、應用程序、應用程序處理、客戶端名稱、鎖名稱、鎖類型、SQL 語句操作,等等。
用戶可以在這裡看到鎖是怎樣產生的同時,也可以通過看到導致鎖產生的語句。此頁面主要信息包括:
按參與者分類的鎖
被特別指出的中斷參與者
死鎖中包含的鎖 .
死鎖中被特別指出的中斷鎖
圖 13. 參與者鎖信息 -2
查看原圖(大圖)
從此界面進一步分析,可以看到此死鎖是由於兩個“UPDATE ”語句互相等待造成的。
圖 14. 語句信息
從圖 14 可以看到所有導致或者涉及鎖的 SQL 語句,選擇任何一條都可以得到以下信息:
詳細的 SQL 語句
參數標記值(如果有的話)
跟選擇語句相關的鎖詳細信息
這裡需要注意的是,如果歷史語句是啟用的,只有最後一條語句顯示在這裡。此處對於正在執行或者無限等待的語句,可以通過“停止當前語句(Stop Current Statement …)”去停止該語句的執行。也可以通過“調整(Tune) ”按鈕開啟 Optim Query Tuner (OQT) 對該語句進行分析調優,該功能後面將詳細介紹。
圖 15. 鎖信息
查看原圖(大圖)
圖 15 詳細地展示了鎖名稱,屬性,模式,以及相關的表空間,表模式,表名,鎖狀態等信息。
使用 OPM 分析、定位鎖等待問題
應用程序在執行中發生連接等待、鎖等待問題也會被 OPM 監控到,並且將主要信息展示出來。這些信息包括應用程序名稱、應用程序標識、等待時間、客戶機工作站名稱、客戶機應用程序名稱等,如下圖所示:
圖 16. 等待中的連接信息
查看原圖(大圖)
選中一條等待的連接紀錄,點擊“分析(Analyze …)”進行詳細分析。
圖 17. 分析鎖狀態
查看原圖(大圖)
從圖 17 可以看到等待的時間,以及相關的表空間,表名,鎖類型,鎖等待時間,SQL 語句,應用程序詳細信息,同時還有所有活動的信息, 讀取數據信息。如果想得到正在執行的 SQL 語句的詳細地執行信息,可以通過點擊“到活動 SQL 儀表盤(Go to the Active SQL Dashboard )”進入到“活動 SQL ”界面,在這裡可以看到 SQL 語句的開始,結束時間,CPU 消耗,讀取行數,緩沖池命中率,排序時間等等。如圖 18 所示:
圖 18. 活動 SQL 語句界面
查看原圖(大圖)
使用 OPM 避免、解決死鎖及鎖等待問題
系統運行中給定權限的用戶,可以強行終止或者取消當前活動,對於給定了用戶名和密碼的用戶通過圖 14 和圖 17 可以看到 OPM 提供了便捷的圖形化工具。點擊“強制終止應用程序(Force Application)”即可停掉執行無法結束的程序,等到下面的提示信息。
圖 19. 終止應用程序
有些鎖問題,是由於 SQL 語句執行時間過長造成,可以直接點擊“停止當前語句 (Stop Current Statement)”取消正在執行的 SQL,同時需要分析、優化 SQL 語句以提高 SQL 的執行性能,OPM 與 Optim Query Tuner( 本文簡稱 OQT) 產品也作了集成,所以對於需要定位、分析、調優 SQL 語句問題,通過選定 OPM 相應的界面“Tune”按鈕(本文中涉及到的有圖 14,圖 17 和圖 18),即可切換到 OQT。注意:如果想 OPM 順利的切換到 OQT 需要做兩點:(1)將 OQT 打開 (2)啟動數據橋接服務器。
從 OPM 切換到 OQT,OQT 會自動寫入 OPM 監控數據庫的監控信息,提示輸入登陸信息,如下圖所示:
圖 20. 登錄 OQT