关于 DB2 v8 中的 DB2DETAILDEADLOCK 事件监视器的禁用和重建

来源:百度文库 编辑:神马文学网 时间:2024/04/24 15:48:23

关于 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这一详细死锁监视器便会重新创建起来。