db2死鎖監視器的使用(好用)

flywiththewind發表於2018-11-01

DB2DETAILDEADLOCK 事件監視器的禁用和重建

  (2013-02-16 13:32:47)

db2死鎖監視器的使用(好用) 轉載

標籤:  

it

分類:   DB2

關於 DB2 v8 中的 DB2DETAILDEADLOCK 事件監視器的禁用和重建

一. 開啟的監視器對資料庫效能的影響:

DB2常用來收集監視資訊的工具有兩種:快照監視器和事件監視器。前者用於獲取特定時間點的監視資料,後者用於獲取特定事件的監視資料。無論使用者使用哪種監視工具收集資料庫系統監視器相關的資料,都會引起一定的系統開銷,包括記憶體,CPU以及為獲取監視資料而產生的額外呼叫處理等,為控制收集必要的監視資訊,減少不必要的系統開銷,DB2引入了監視器開關的機制。每種開關都有“ON”和“OFF”兩種狀態,當開關處於“OFF”時,其控制下的相關監視元素的資訊將不被收集。DB2例項級(資料庫管理器)的監視器狀態可用 “db2 get dbm monitor switches " 來獲取。當例項下有監視程式開啟某個開關時,例項級所對應的開關也將被開啟。

例如:

收集到的 DBM 系統監視器資訊

db 分割槽號 0 的開關列表
緩衝池活動資訊 (BUFFERPOOL) = OFF
鎖定資訊 (LOCK) = OFF
排序資訊 (SORT) = OFF
SQL 語句資訊 (STATEMENT) = OFF
表活動資訊 (TABLE) = OFF
獲取時間戳記資訊(時間戳記) = ON 2005-06-26 10:36:47.019334 <-- 時間戳監視器開關開啟的時間
工作單元資訊 (UOW) = OFF


使用快照監視器時必須首先透過“db2 update monitor switches”、db2MonitorSwitches API或其它間接方式開啟要收集的資料的監視器開關,而事件監視器則不受系統監視器開關設定的影響(TIMESTAMP監視器開關除外,它是唯一一個對所有監視器都起作用的開關),在資料庫連線後,啟用的事件監視器將自動開啟與這一監視器相關的例項級監視器的開關。事件監視器可收集如下型別的事件:

DATABASE
TABLES
DEADLOCKS
BUFFERPOOLS
CONNECTIONS
STATEMENTS
TRANSACTIONS

而建立資料庫時預設建立的監控死鎖詳細資訊的DB2DETAILDEADLOCK,由於建立時選擇了AUTOSTART選項,因此會在資料庫連線後被自動啟用並將例項的LOCK監視器開關開啟。如對於SAMPLE資料庫進行連線後,被啟用的DB2DETAIDEADLOCK事件監視器會使LOCK監視器開關處於“ON”的狀態:

db2 connect to sample

資料庫連線資訊

資料庫伺服器 = DB2/NT 8.2.1
SQL 授權標識 = DB2TEST
本地資料庫別名 = SAMPLE

db2 get dbm monitor switches

收集到的 DBM 系統監視器資訊

db 分割槽號 0 的開關列表
緩衝池活動資訊 (BUFFERPOOL) = OFF
鎖定資訊 (LOCK) = ON 2005-06-26 14:25:00.972053 <-- DB2DETAILDEADLOCK將LOCK監視器開關開啟的時間
排序資訊 (SORT) = OFF
SQL 語句資訊 (STATEMENT) = OFF
表活動資訊 (TABLE) = OFF
獲取時間戳記資訊(時間戳記) = ON 2005-06-26 10:36:47.019334
工作單元資訊 (UOW) = OFF

前面已經提到,由於開啟LOCK監視器開關會引起一些額外的開銷,特別是在DB2DETAILDEADLOCK為了收集更詳細的死鎖資訊而在建立時使用了“WITH DETAIL”選項,與僅使用DEADLOCKS的監視器相比還要額外收集:

1. 發生死鎖時應用程式所執行的語句
2. 死鎖時應用程式所持有的鎖定

因此它對效能的影響較僅用DEADLOCKS的會更大。為提高資料庫效能,在不需要監控死鎖的問題時,可考慮禁用DB2DETAIDEADLOCK事件監視器。在禁用之前首先要了解檢視事件監視器開關所處狀態的方法,這需要藉助SQL函式EVENT_MON_STATE來完成:

db2 "select evmonname, EVENT_MON_STATE(evmonname) as state from syscat.eventmonitors"

舉例輸出為:

EVMONNAME STATE
---------------- -------
DB2DETAILDEADLOCK 1

1 條記錄已選擇。

注:STATE=0 表明事件監視器的開關為“關閉”狀態,連線資料庫後,這樣的事件監視器不會開啟相應的資料庫管理器監視器的開關;STATE=1 表明開關為“開啟”狀態,連線資料庫後,這樣的事件監視器將開啟相應的資料庫管理器監視器的開關。


二. 禁用事件監視器的方法:

透過如下語句可關閉DB2DETAILDEADLOCK事件監視器:

db2 set event monitor db2detaildeadlock state 0

不過由於DB2DETAILDEADLOCK監視器建立時使用了AUTOSTART選項,因此上述SQL語句只能在此次連線期間禁用該監視器,從而關閉資料庫管理器的LOCK監視器開關,但在下次連線資料庫時,DB2DETAILDEADLOCK又會被自動啟用,並再次開啟該開關。由於AUTOSTART的屬性在事件監視器建立後是無法修改的,所以要長期徹底地禁用這一預設建立的事件監視器,只有刪除它。

由於預設狀態下DB2DETAILDEADLOCK事件監視器是被啟用的,如果直接發出如下刪除監視器的語句:

db2 drop event monitor db2detaildeadlock

會遇到以下報錯:

SQL1619N 不能 DROP 活動的事件監視器。 SQLSTATE=55034

因此需要首先禁用它:

db2 set event monitor db2detaildeadlock state 0

然後再進行刪除操作,便可將DB2DETAILDEADLOCK事件監視器從資料庫中刪除,從而長期禁用了該監視器,避免了例項級的LOCK監視器開關因該監視器的啟用而被開啟。

另外,由於一個例項下可能有不止一個資料庫,則每個庫都會有一個預設的DB2DETAILDEADLOCK事件監視器,連線任何一個庫都會使例項級的LOCK監視器開關被開啟,因此如果要使例項級的LOCK監視器開關處於關閉狀態,必須確保以下三點:


1. 檢查資料庫管理器本身配置中的預設快照監視器開關LOCK是關閉狀態,即執行:

db2 get dbm cfg 

確認輸出中DFT_MON_LOCK的設定為“OFF”狀態:

鎖定 (DFT_MON_LOCK) = OFF

如果為“ON”,可執行下面的語句開啟:

db2 update dbm cfg using dft_mon_lock off (即刻生效)

2. 確保沒有任何應用開啟LOCK監視器開關。

3. 例項下每個已被連線的資料庫中的DB2DETAIDEADLOCK事件監視器均被禁用或刪除。


三. DB2DETAILDEADLOCK事件監視器的重新建立:

如果今後可能需要重新使用DB2DETAILDEADLOCK事件監視器,可在刪除它前先利用如下語句獲取其定義:

db2 select char(a.evmonname,20) as evmonname, char(definer,15) as definer, char(type,16) as type, target_type, char(target,70) as target, maxfiles, maxfilesize, buffersize, io_mode, write_mode, autostart, dbpartitionnum, char(remarks,100) as remarks from syscat.eventmonitors a, syscat.events b where a.evmonname='DB2DETAILDEADLOCK' and a.evmonname=b.evmonname

以Windows平臺上的輸出舉例:

EVMONNAME DEFINER TYPE TARGET_TYPE TARGET
MAXFILES MAXFILESIZE
BUFFERSIZE IO_MODE WRITE_MODE AUTOSTART DBPARTITIONNUM REMARKS

-------------------- --------------- ---------------- ----------- --------------
-------------------------------------------------------- ----------- -----------
----------- ------- ---------- --------- -------------- -----------------------
-----------------------------------------------------------------------------
DB2DETAILDEADLOCK LIWENLI DETAILDEADLOCKS F C:\DB2\NODE000
0\SQL00002\DB2EVENT\db2detaildeadlock 20 512
17 B A Y 0 -

1 條記錄已選擇。

以上述輸出為例重新建立名為DB2DETAILDEADLOCK(當然也可使用其他名稱)的詳細死鎖事件監視器的語句為:

db2 create event monitor db2detaildeadlock for deadlocks with details write to file 'C:\DB2\NODE0000\SQL00002\DB2EVENT\db2detaildeadlock' autostart on dbpartitionnum 0 maxfiles 20 maxfilesize 512 buffersize 17 blocked append

當語句成功執行後,DB2DETAILDEADLOCK這一詳細死鎖監視器便會重新建立起來。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26224914/viewspace-2218461/,如需轉載,請註明出處,否則將追究法律責任。

相關文章