db2死锁监视器的使用方法

56次阅读
没有评论

共计 4223 个字符,预计需要花费 11 分钟才能阅读完成。

这篇文章主要介绍“db2 死锁监视器的使用方法”,在日常操作中,相信很多人在 db2 死锁监视器的使用方法问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”db2 死锁监视器的使用方法”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

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

到此,关于“db2 死锁监视器的使用方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-01发表,共计4223字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)