db2死鎖監視器的使用(好用)
DB2DETAILDEADLOCK 事件監視器的禁用和重建
(2013-02-16 13:32:47)
標籤:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- db2 事件監視器型別DB2事件型別
- 鎖的使用與死鎖的避免
- 檢視oracle死鎖程式並結束死鎖Oracle
- 作業系統(5) 死鎖的概念 死鎖產生的必要條件 死鎖的處理策略 預防死鎖 避免死鎖 死鎖的檢測和解除 銀行家演算法作業系統演算法
- DB2檢視索引的使用情況DB2索引
- 死鎖
- 面試:什麼是死鎖,如何避免或解決死鎖;MySQL中的死鎖現象,MySQL死鎖如何解決面試MySql
- db2 鎖分析 DB2_CAPTURE_LOCKTIMEOUT使用DB2APT
- MySQL:一個死鎖分析 (未分析出來的死鎖)MySql
- dwg檢視器使用技巧(方便好用的dwg檢視器推薦 )
- SQL Server 的死鎖SQLServer
- Java 中的死鎖Java
- SQLServer的死鎖分析(1):頁鎖SQLServer
- 什麼是死鎖?如何解決死鎖?
- 面試官:什麼是死鎖?怎麼排查死鎖?怎麼避免死鎖?面試
- 死鎖概述
- 例項詳解 Java 死鎖與破解死鎖Java
- MySQL 死鎖和鎖等待MySql
- 死鎖和可重入鎖
- 剖析6個MySQL死鎖案例的原因以及死鎖預防策略MySql
- synchronized的monitor監視器synchronized
- Java的物件監視器Java物件
- SQL SERVER死鎖查詢,死鎖分析,解鎖,查詢佔用SQLServer
- 死鎖是什麼?如何預防和避免死鎖?
- MySQL死鎖系列-線上死鎖問題排查思路MySql
- python之GIL全域性直譯器鎖,自定義互斥鎖,死鎖與遞迴鎖Python遞迴
- 死鎖-舉例
- 併發:死鎖
- 遭遇ITL死鎖
- 死鎖案例分析
- GCD 死鎖原因GC
- 死鎖案例二
- 死鎖案例三
- Oracle死鎖一例(ORA-00060),鎖表導致的業務死鎖問題Oracle
- Mysql使用kill命令解決死鎖問題MySql
- golang 中 channel 的詳細使用、使用注意事項及死鎖分析Golang
- 執行緒中的死鎖執行緒
- 使用jstack檢測Java應用的死鎖(deadlock)狀態JSJava