查看: 7037|回复: 4

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

[复制链接]
论坛徽章:
3
授权会员
日期:2006-02-05 11:03:26数据库板块每日发贴之星
日期:2006-02-10 01:02:41IBM软件技术精英协会成员
日期:2006-12-21 15:37:12
跳转到指定楼层
1#
发表于 2006-2-5 17:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一. 打开的监视器对数据库性能的影响:

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这一详细死锁监视器便会重新创建起来。
论坛徽章:
5
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:532009新春纪念徽章
日期:2009-01-04 14:52:282011新春纪念徽章
日期:2011-02-18 11:43:33
2#
发表于 2007-12-2 10:57 | 只看该作者
db2 select evmonname, EVENT_MON_STATE(evmonname) as state from syscat.eventmonitors
我执行这个结果是1 ,就是说打开的
可我get dbm cfg  锁定                                   (DFT_MON_LOCK) = OFF 怎么回事啊?

使用道具 举报

回复
招聘 : Linux运维
论坛徽章:
235
紫蜘蛛
日期:2007-09-26 17:05:46玉兔
日期:2007-09-26 17:05:05现任管理团队成员
日期:2011-05-07 01:45:08玉兔
日期:2006-08-29 20:38:48紫蜘蛛
日期:2007-09-26 17:05:34阿斯顿马丁
日期:2013-11-19 10:38:16奔驰
日期:2013-10-16 09:08:58红旗
日期:2014-01-09 11:57:39路虎
日期:2013-08-13 14:52:35林肯
日期:2015-05-19 13:01:16
3#
发表于 2007-12-2 12:15 | 只看该作者
LZ的ID: ganquan

莫非就是大名鼎鼎的甘荃   甘前辈??

使用道具 举报

回复
论坛徽章:
233
天枰座
日期:2016-02-02 09:36:332012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-06-22 19:28:30现任管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:拳击
日期:2011-04-08 16:56:552011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
4#
发表于 2007-12-2 23:46 | 只看该作者
原帖由 acme1921209 于 2007-12-2 10:57 发表
db2 select evmonname, EVENT_MON_STATE(evmonname) as state from syscat.eventmonitors
我执行这个结果是1 ,就是说打开的
可我get dbm cfg  锁定                                   (DFT_MON_LOCK) = OFF ...


两码事

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2006-02-05 11:03:26数据库板块每日发贴之星
日期:2006-02-10 01:02:41IBM软件技术精英协会成员
日期:2006-12-21 15:37:12
5#
 楼主| 发表于 2007-12-3 20:20 | 只看该作者
1. db2 select evmonname, EVENT_MON_STATE(evmonname) as state from syscat.eventmonitors
我执行这个结果是1 ,就是说"event monitor"打开的。

2. get dbm cfg  锁定                                   (DFT_MON_LOCK) = OFF 怎么回事啊?

DFT_MON_LOCK参数是针对snapshot 而言的。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表