當(dāng)多個(gè) DB2® 用戶并發(fā)地訪問(wèn)一個(gè)數(shù)據(jù)庫(kù)時(shí),鎖等待會(huì)導(dǎo)致響應(yīng)變慢。鎖等待是臨時(shí)性的,因而難以捕捉。然而,當(dāng)出現(xiàn)鎖等待情形時(shí),需要由數(shù)據(jù)庫(kù)管理員負(fù)責(zé)確定鎖等待的原因。本文通過(guò)例子演示如何使用用于 DB2 for Linux®, UNIX®, and Windows® 的 db2pd 和 db2pdcfg 實(shí)用程序完成該任務(wù)。
用于鎖監(jiān)視的 db2pd 選項(xiàng)
db2pd 是用于監(jiān)視各種 DB2 數(shù)據(jù)庫(kù)活動(dòng)以及故障排除的實(shí)用程序。它是從 DB2 V8.2 開始隨 DB2 引擎發(fā)布的一個(gè)獨(dú)立的實(shí)用程序,其外觀和功能類似于 Informix onstat 實(shí)用程序。db2pd 是從命令行以一種可選的交互模式執(zhí)行的。該實(shí)用程序運(yùn)行得非???,因?yàn)樗恍枰@取任何鎖,并且在引擎資源以外運(yùn)行(這意味著它甚至能在一個(gè)掛起的引擎上工作)。通過(guò)快照監(jiān)視還可以收集 db2pd 提供的很多監(jiān)視器數(shù)據(jù),但是 db2pd 和快照監(jiān)視的輸出格式卻有很大不同。這使 DBA 可以選擇更符合用戶需求的監(jiān)視替代方法。本文關(guān)注用于鎖監(jiān)視的 db2pd 選項(xiàng)。有一篇由 Sam Poon 撰寫的 developerWorks 文章(參見 參考資料 小節(jié))對(duì) db2pd 的監(jiān)視功能作了更廣泛的介紹。
下面的圖展示了用于鎖監(jiān)視的 db2pd 選項(xiàng):
圖 1. 用于鎖監(jiān)視的 db2pd 選項(xiàng)
TranHdl:用于指定事務(wù)句柄,以便只監(jiān)視由特定事務(wù)持有的鎖。
showlocks:這個(gè)子選項(xiàng)將鎖名稱擴(kuò)展成有意義的解釋。對(duì)于一個(gè)行鎖,該選項(xiàng)顯示以下信息:表空間 ID、表 ID、分區(qū) ID、頁(yè)和槽。通過(guò)使用編目視圖 SYSCAT.TABLES 上的一個(gè)查詢,很容易將表空間 ID 和表 ID 映射到相應(yīng)的表名:
清單 1. 將表空間 ID、表 ID 映射到表模式、表名
SELECT TABSCHEMA, TABNAMEFROM SYSCAT.TABLESWHERE TBSPACEID = tbspaceid AND TABLEID = tableid
wait:如果指定 wait 子選項(xiàng),則 db2pd 只顯示事務(wù)當(dāng)前正在等待的鎖,以及對(duì)等待情形負(fù)責(zé)的鎖。這個(gè)子選項(xiàng)大大簡(jiǎn)化了鎖等待分析,因?yàn)樗鼘⑤敵鱿拗茷閰⑴c鎖等待情形的鎖。
db2pd database 和 file 選項(xiàng)不是特定于鎖監(jiān)視的,但是適用于(幾乎)所有 db2pd 調(diào)用。database 選項(xiàng)將 db2pd 返回的監(jiān)視器數(shù)據(jù)限制為某個(gè)數(shù)據(jù)庫(kù)的監(jiān)視器數(shù)據(jù)。而 file 選項(xiàng)則允許定義一個(gè)文件,以便將 db2pd 輸出寫到該文件。
鎖等待分析場(chǎng)景
接下來(lái),我們開始使用前面介紹的 db2pd 選項(xiàng)來(lái)分析一個(gè)示例鎖等待情形。為此,我們創(chuàng)建 DB2 SAMPLE 數(shù)據(jù)庫(kù):
清單 2. 創(chuàng)建 SAMPLE 數(shù)據(jù)庫(kù)
db2sampl
用戶 A 執(zhí)行事務(wù) A,以根據(jù)每個(gè)經(jīng)理的薪水為他們提供 10% 的獎(jiǎng)金:
清單 3. 事務(wù) A 執(zhí)行的更新操作
UPDATE EMPLOYEESET BONUS = SALARY * 0.1WHERE JOB = 'MANAGER'
當(dāng)事務(wù) A 仍然在運(yùn)行(因?yàn)橛脩?A 還沒有使用 COMMIT 或 ROLLBACK 終止該事務(wù))時(shí),用戶 B 執(zhí)行事務(wù) B,以將每個(gè)雇員的薪水提高 2%:
清單 4. 事務(wù) B 執(zhí)行的更新操作
UPDATE EMPLOYEESET SALARY = SALARY * 0.02
由于事務(wù) B 沒有完成,用戶 B 請(qǐng)求 DBA 確定問(wèn)題的原因。于是,DBA 調(diào)用 db2pd,看是否存在鎖等待情形:
清單 5. 檢查鎖等待情形
db2pd -db sample -locks wait showlocksDatabase Partition 0 -- Database SAMPLE -- Active -- Up 3 days 08:33:05Locks:Address TranHdl Lockname Type Mode Sts Owner Dur 0x050A0240 6 02000600050040010000000052 Row ..X W 2 1 0x050A0DB0 2 02000600050040010000000052 Row ..X G 2 1 HoldCount Att ReleaseFlg0 0x00 0x40000000 TbspaceID 2 TableID 6 PartitionID 0 Page 320 Slot 50 0x00 0x40000000 TbspaceID 2 TableID 6 PartitionID 0 Page 320 Slot 5
db2pd 報(bào)告 ID 為 2 的表空間中一個(gè) ID 為 6 的表上有一個(gè)行鎖存在鎖等待情形。通過(guò)檢查 SYSCAT.TABLES,DBA 斷定表 EMPLOYEE 上的確存在鎖等待。
清單 6. 確定鎖等待情形所涉及的表
本文轉(zhuǎn)自IBM Developerworks中國(guó)
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/ibmjournal/archive/2008/10/07/3028834.aspx