DB2死锁问题与日常维护

查看死锁

db2 get snapshot for locks on  dbname

db2 "force application(Application handle)"
db2 "force application(214)"


上线之后维护时我们要做的几件事情 

1. 做好定期维护 

通过使用如下命令进行维护: 
-reorg表和索引定期重组 
-runstats表和索引的统计信息定期更新 
-rebind 程序包定期重新编译 

2. 日常观察db2diag.log文件 

查看下面锁升级信息  escalation 
  
  
2006- 02- 13- 11.05. 08.060000- 480 E613164H452 LEVEL: Warning PID : 2112 TID : 3132 PROC : db2syscs.exe INSTANCE: DB2 NODE : 000 DB : SAMPLE APPHDL : 0- 170 APPID: *LOCAL.DB2. 060213185727 FUNCTION: DB2 UDB, data management, sqldEscalateLocks, probe: 3 MESSAGE : ADM5502W The escalation of " 35" locks on table "TEDWAS .
STAFF" to lock intent "X" was successful.

查看下面死锁或锁超时信息 DeadLock or Lock timeout 
  
  
2006- 11- 08- 16.29. 11.398155+ 480 E36235682A521 LEVEL: Error PID : 12979 TID : 1 PROC : db2agent (TESTDB) 0 INSTANCE: db2inst1 NODE : 000 DB : TESTDB APPHDL : 0- 288 APPID: 198.132. 3.100. 57177.061108070923 AUTHID : TESTDB FUNCTION: DB2 UDB, data management, sqldEscalateLocks, probe: 4 MESSAGE : ADM5503E The escalation of " 2" locks on table“TESTDB.TEST12" to lock intent "X" has failed.
The SQLCODE is "- 911". 2006- 11- 08- 16.24. 39.672914+ 480 E36100838A502 LEVEL: Error PID : 20866 TID : 1 PROC : db2agent (TESTDB) 0 INSTANCE: db2inst1 NODE : 000 DB : TESTDB APPHDL : 0- 1394 APPID: 198.132. 3.110. 58426.061108075556 AUTHID : TESTDB FUNCTION: DB2 UDB, data management, sqldEscalateLocks, probe: 4 MESSAGE : ADM5503E The escalation of " 1" locks on table “TESTDB.
TEST11" to lock intent "X" has failed. The SQLCODE is "- 952".

我们可以看到红字标识出的锁升级( escalation ),锁等待锁超时( The SQLCODE is "-911" ),程序由于锁的原因而终止( The SQLCODE is "-952 ".) 

3. 观察命令list applications的输出 

    查看应用程序的状态是否有锁定等待(Lock-wait)状态出现。
    
    执行命令 list applications for db sample show detail 得到如下结果 

  
  
DB2ADMIN db2bp.exe 1129 *LOCAL.DB2. 071128162517 00001 1 0 348
锁定等待 2006- 11- 29 00: 25: 52.417899 TEST SAMPLE C:\DB2\NODE0000\SQL00001\ DB2ADMIN db2taskd 1127 *LOCAL.DB2. 071128162445 00001 1 0 628
连接已完成 2006- 11- 29 00: 24: 43.909356 TEST SAMPLE C:\DB2\NODE0000\SQL00001\ 。。。。。。。。 DB2ADMIN db2bp.exe 1126 *LOCAL.DB2. 071128162443 00001 1 0 976 UOW
正在等待 2006- 11- 29 00: 25: 00.559420 TEST SAMPLE C:\DB2\NODE0000\ SQL00001\ 。。。。。。。。

    这里我们可以看到应用程序(1129)正在等待其他应用程序锁的释放,而应用程序(1126)正在执行程序,其中1129和1126分别是应用程序的ID。 

4. 观察快照信息(snapshot)的输出 

    在得到快照信息之前需要将锁定信息快照开关打开,命令如下 

update dbm cfg using dft_mon_lock on(实例级别) 
update monitor switches using lock on(会话级别,推荐使用) 

    之后可以用如下命令取出快照信息 

get snapshot for locks on sample 

    我们可以得到类似信息: 

数据库锁定快照 
数据库名称           = SAMPLE 
数据库路径            = C:\DB2\NODE0000\SQL00001\ 
输入数据库别名            = SAMPLE 
挂起的锁定            = 8 
当前已连接的应用程序            = 2 
当前正等待锁定的代理程序数            = 1 
快照时间戳记            = 2007-11-29 17:54:13.992157 
应用程序句柄            = 54 
应用程序标识            = *LOCAL.DB2.071129094306 
序号            = 00001 
应用程序名            = db2bp.exe CONNECT 
授权标识            = DB2ADMIN 
应用程序状态            = 锁定等待 
状态更改时间            = 2007-11-29 17:50:16.124739 
应用程序代码页            = 1386 
挂起的锁定            = 4 
总计等待时间(毫秒)            = 237867 

锁定列表 
锁定名称            = 0x030006000500C0020000000052 
锁定属性            = 0x00000008 
发行版标志            = 0x40000000 
锁定计数            = 1 
挂起计数            = 0 
锁定对象名            = 46137349 
对象类型            = 行 
表空间名            = IBMDB2SAMPLEREL 
表模式            = DB2ADMIN 
表名            = TEST1 
方式            = X

。。。。。。。。。。。。。。 

锁定名称            = 0x03000600000000000000000054 
锁定属性            = 0x00000000 
发行版标志            = 0x40000000 
锁定计数            = 1 
挂起计数            = 0 
锁定对象名            = 6 
对象类型            = 表 
表空间名             IBMDB2SAMPLEREL 
表模式            = DB2ADMIN
表名             TEST1 方式 = IX 。。。。。。。。。。。。。 

    从上面信息可以看到应用程序(54)正处于锁定等待状态,而这个程序所要求的锁,在快照信息里有详细描述(由红字标识出的),同时我们还可以看到整个数据库其他程序的锁定信息,要想得到某个应用程序的锁定信息,可用如下命令: 

get snapshot for locks for application agentid 54 

    其中54就是应用程序的句柄 

5. 注意无效程序(Invalid pakage)的监控 

    如果系统里有存储过程或用户自定义函数或嵌入C的程序,这些程序包含静态SQL,在编译时会生成执行代码片段,存储在数据库的系统表里,在程序执行时直接调用这些代码执行。 

    在系统运行一段时间后,如果发生了表结构变了,索引删除了,统计信息发生变化了等这些程序所依赖的对象发生变化,那这些执行代码片段可能会失效或不可用。我们需要对这些程序进行监控,可以用下面命令查询无效程序(pakage): 
select pkgname,valid,last_bind_time from syscat.packages where pkgschema = 'name' and valid != 'Y' 

    如果状态(valid)为N,说明需要重新绑定,如果状态为X,说明某些其依赖的对象被删掉了,需要重新创建那些被依赖的对象(如:表) 

    要想重新绑定,可以执行下面命令: 
rebind package pkgname resolve any 

    同时DB2还提供一个db2rbind命令,这个命令可以一次绑定所有有效或无效的程序(pakage),命令如下: 
db2rbind dbname -l logfile all 

6. 监控运行时间长排序次数多读最多运行频率高的SQL 

    要想查看这些SQL,可以通过表函数(DB2 V8)或系统管理视图(DB2 V9)来实现。 

    在DB2 V9中增加了管理视图,可以如下使用: 

查看执行时间最长的 5 个动态 SQL 语句:

  
  
select AVERAGE_EXECUTION_TIME_S , SUBSTR(STMT_TEXT, 1, 200) AS STMT_TEXT from SYSIBMADM.
TOP_DYNAMIC_SQL order by AVERAGE_EXECUTION_TIME_S desc fetch first 5 rows only;

查看执行频率最高的 5 个动态 SQL 语句:

  
  
select NUM_EXECUTIONS, AVERAGE_EXECUTION_TIME_S, STMT_SORTS, SORTS_PER_EXECUTION,
SUBSTR(STMT_TEXT, 1, 200) AS STMT_TEXT from SYSIBMADM.
TOP_DYNAMIC_SQL ORDER BY NUM_EXECUTIONS desc fetch first 5 rows only;

查看排序次数最多的 5 个动态 SQL 语句:

  
  
select STMT_SORTS, SORTS_PER_EXECUTION, substr(STMT_TEXT, 1, 200) as STMT_TEXT from SYSIBMADM.
TOP_DYNAMIC_SQL order by STMT_SORTS desc fetch first 5 rows only;

    在DB2 V8中增加了表函数,可以如下使用: 

查看执行时间最长的 5 个动态 SQL 语句:

  
  
select TOTAL_EXEC_TIME/NUM_EXECUTIONS, SUBSTR(STMT_TEXT, 1, 200)
AS STMT_TEXT FROM TABLE( SNAPSHOT_DYN_SQL (CAST(NULL AS VARCHAR( 1)), CAST (NULL AS INTEGER)))
as SNAPSHOT_DYN_SQL order by TOTAL_EXEC_TIME/NUM_EXECUTIONS desc fetch first 5 rows only;

查看执行频率最高的 5 个动态 SQL 语句:

  
  
select NUM_EXECUTIONS, TOTAL_EXEC_TIME/NUM_EXECUTIONS, STMT_SORTS,
STMT_SORTS/NUM_EXECUTIONS as SORTS_PER_EXECUTION,
SUBSTR(STMT_TEXT, 1, 200) AS STMT_TEXT from TABLE( SNAPSHOT_DYN_SQL (CAST(NULL AS VARCHAR( 1)),
CAST (NULL AS INTEGER))) as SNAPSHOT_DYN_SQL ORDER BY NUM_EXECUTIONS desc fetch first 5 rows only;;

查看排序次数最多的 5 个动态 SQL 语句:

  
  
select STMT_SORTS, STMT_SORTS/NUM_EXECUTIONS as SORTS_PER_EXECUTION,
substr(STMT_TEXT, 1, 200) as STMT_TEXT from TABLE( SNAPSHOT_DYN_SQL (CAST(NULL AS VARCHAR( 1)),
CAST (NULL AS INTEGER))) as SNAPSHOT_DYN_SQL order by STMT_SORTS desc fetch first 5 rows only;

    如果发现了运行成本比较高的SQL,就要来优化这些SQL的执行效率,来降低持有锁的锁产生的资源消耗,进一步降低死锁和锁等待的产生。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值