DB2数据库发生死锁了怎么办
2010-08-25 14:27
357 查看
鉴于CSDN无故删除博文,本博客不再更新,暂时迁至http://www.db365.net
DB2数据库发生死锁了怎么办?
责任编辑:郑重作者:IT168陈敏
2007-12-18
【内容导航】
第1页:上线前的准备
第2页:维护时的注意事项
第3页:发生死锁后的对策
文本Tag:IBMDB2
DB2
上线之后维护时我们要做的几件事情
1. 做好定期维护
通过使用如下命令进行维护:
-reorg表和索引定期重组
-runstats表和索引的统计信息定期更新
-rebind 程序包定期重新编译
2. 日常观察db2diag.log文件
查看下面锁升级信息 escalation
2006-02-13-11.05.08.060000-480
E613164H452 LEVEL: Warning PID :2112
TID :3132PROC
: db2syscs.exe INSTANCE: DB2 NODE :000 DB : SAMPLE APPHDL :0-170
APPID: *LOCAL.DB2.060213185727FUNCTION:
DB2 UDB, data management, sqldEscalateLocks, probe:3MESSAGE
: ADM5502W The escalationof "35"
locks ontable
"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 :1PROC
: 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:4MESSAGE
: ADM5503E The escalationof "2"
locks ontable“TESTDB.TEST12"to
lock intent "X" has failed.
The SQLCODEis "-911".2006-11-08-16.24.39.672914+480
E36100838A502 LEVEL: Error PID :20866
TID :1PROC
: 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:4MESSAGE
: ADM5503E The escalationof "1"
locks ontable“TESTDB.
TEST11"
to lock intent "X" has failed. The SQLCODEis
"-952".
我们可以看到红字标识出的锁升级(escalation),锁等待锁超时(The SQLCODE is "-911"),程序由于锁的原因而终止(The
SQLCODE is "-952".)
3. 观察命令list applications的输出
查看应用程序的状态是否有锁定等待(Lock-wait)状态出现。
执行命令 list applications for db sample show detail
得到如下结果
DB2ADMIN db2bp.exe1129*LOCAL.DB2.0711281625170000110348
锁定等待 2006-11-2900:25:52.417899
TEST SAMPLE C:/DB2/NODE0000/SQL00001/ DB2ADMIN db2taskd 1127*LOCAL.DB2.0711281624450000110628
连接已完成 2006-11-2900:24:43.909356
TEST SAMPLE C:/DB2/NODE0000/SQL00001/ 。。。。。。。。 DB2ADMIN db2bp.exe1126*LOCAL.DB2.0711281624430000110976
UOW
正在等待 2006-11-2900: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_TEXTfrom SYSIBMADM.
TOP_DYNAMIC_SQLorderby
AVERAGE_EXECUTION_TIME_Sdescfetch
first5 rowsonly;
查看执行频率最高的 5个动态 SQL
语句:
select NUM_EXECUTIONS, AVERAGE_EXECUTION_TIME_S, STMT_SORTS, SORTS_PER_EXECUTION,
SUBSTR(STMT_TEXT,1,200)AS
STMT_TEXTfrom SYSIBMADM.
TOP_DYNAMIC_SQLORDERBY
NUM_EXECUTIONSdescfetch
first5 rowsonly;
查看排序次数最多的 5个动态 SQL
语句:
select STMT_SORTS, SORTS_PER_EXECUTION, substr(STMT_TEXT,1,200)as
STMT_TEXTfrom SYSIBMADM.
TOP_DYNAMIC_SQLorderby
STMT_SORTSdescfetch
first5 rowsonly;
在DB2 V8中增加了表函数,可以如下使用:
查看执行时间最长的 5 个动态 SQL 语句:
select TOTAL_EXEC_TIME/NUM_EXECUTIONS,
SUBSTR(STMT_TEXT,1,200)
AS STMT_TEXTFROMTABLE(
SNAPSHOT_DYN_SQL (CAST(NULLASVARCHAR(1)),CAST
(NULLASINTEGER)))
as SNAPSHOT_DYN_SQLorderby
TOTAL_EXEC_TIME/NUM_EXECUTIONSdescfetch
first5 rowsonly;
查看执行频率最高的 5个动态 SQL
语句:
select NUM_EXECUTIONS, TOTAL_EXEC_TIME/NUM_EXECUTIONS,
STMT_SORTS,
STMT_SORTS/NUM_EXECUTIONSas
SORTS_PER_EXECUTION,
SUBSTR(STMT_TEXT,1,200)AS
STMT_TEXTfromTABLE(
SNAPSHOT_DYN_SQL (CAST(NULLASVARCHAR(1)),
CAST (NULLASINTEGER)))
as SNAPSHOT_DYN_SQLORDERBY
NUM_EXECUTIONSdescfetch
first5 rowsonly;;
查看排序次数最多的 5个动态 SQL
语句:
select STMT_SORTS, STMT_SORTS/NUM_EXECUTIONSas
SORTS_PER_EXECUTION,
substr(STMT_TEXT,1,200)as
STMT_TEXTfromTABLE(
SNAPSHOT_DYN_SQL (CAST(NULLASVARCHAR(1)),
CAST (NULLASINTEGER)))
as SNAPSHOT_DYN_SQLorderby
STMT_SORTSdescfetch
first5 rowsonly;
如果发现了运行成本比较高的SQL,就要来优化这些SQL的执行效率,来降低持有锁的锁产生的资源消耗,进一步降低死锁和锁等待的产生。
DB2数据库发生死锁了怎么办?
责任编辑:郑重作者:IT168陈敏
2007-12-18
【内容导航】
第1页:上线前的准备
第2页:维护时的注意事项
第3页:发生死锁后的对策
文本Tag:IBMDB2
DB2
上线之后维护时我们要做的几件事情
1. 做好定期维护
通过使用如下命令进行维护:
-reorg表和索引定期重组
-runstats表和索引的统计信息定期更新
-rebind 程序包定期重新编译
2. 日常观察db2diag.log文件
查看下面锁升级信息 escalation
2006-02-13-11.05.08.060000-480
E613164H452 LEVEL: Warning PID :2112
TID :3132PROC
: db2syscs.exe INSTANCE: DB2 NODE :000 DB : SAMPLE APPHDL :0-170
APPID: *LOCAL.DB2.060213185727FUNCTION:
DB2 UDB, data management, sqldEscalateLocks, probe:3MESSAGE
: ADM5502W The escalationof "35"
locks ontable
"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 :1PROC
: 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:4MESSAGE
: ADM5503E The escalationof "2"
locks ontable“TESTDB.TEST12"to
lock intent "X" has failed.
The SQLCODEis "-911".2006-11-08-16.24.39.672914+480
E36100838A502 LEVEL: Error PID :20866
TID :1PROC
: 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:4MESSAGE
: ADM5503E The escalationof "1"
locks ontable“TESTDB.
TEST11"
to lock intent "X" has failed. The SQLCODEis
"-952".
我们可以看到红字标识出的锁升级(escalation),锁等待锁超时(The SQLCODE is "-911"),程序由于锁的原因而终止(The
SQLCODE is "-952".)
3. 观察命令list applications的输出
查看应用程序的状态是否有锁定等待(Lock-wait)状态出现。
执行命令 list applications for db sample show detail
得到如下结果
DB2ADMIN db2bp.exe1129*LOCAL.DB2.0711281625170000110348
锁定等待 2006-11-2900:25:52.417899
TEST SAMPLE C:/DB2/NODE0000/SQL00001/ DB2ADMIN db2taskd 1127*LOCAL.DB2.0711281624450000110628
连接已完成 2006-11-2900:24:43.909356
TEST SAMPLE C:/DB2/NODE0000/SQL00001/ 。。。。。。。。 DB2ADMIN db2bp.exe1126*LOCAL.DB2.0711281624430000110976
UOW
正在等待 2006-11-2900: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_TEXTfrom SYSIBMADM.
TOP_DYNAMIC_SQLorderby
AVERAGE_EXECUTION_TIME_Sdescfetch
first5 rowsonly;
查看执行频率最高的 5个动态 SQL
语句:
select NUM_EXECUTIONS, AVERAGE_EXECUTION_TIME_S, STMT_SORTS, SORTS_PER_EXECUTION,
SUBSTR(STMT_TEXT,1,200)AS
STMT_TEXTfrom SYSIBMADM.
TOP_DYNAMIC_SQLORDERBY
NUM_EXECUTIONSdescfetch
first5 rowsonly;
查看排序次数最多的 5个动态 SQL
语句:
select STMT_SORTS, SORTS_PER_EXECUTION, substr(STMT_TEXT,1,200)as
STMT_TEXTfrom SYSIBMADM.
TOP_DYNAMIC_SQLorderby
STMT_SORTSdescfetch
first5 rowsonly;
在DB2 V8中增加了表函数,可以如下使用:
查看执行时间最长的 5 个动态 SQL 语句:
select TOTAL_EXEC_TIME/NUM_EXECUTIONS,
SUBSTR(STMT_TEXT,1,200)
AS STMT_TEXTFROMTABLE(
SNAPSHOT_DYN_SQL (CAST(NULLASVARCHAR(1)),CAST
(NULLASINTEGER)))
as SNAPSHOT_DYN_SQLorderby
TOTAL_EXEC_TIME/NUM_EXECUTIONSdescfetch
first5 rowsonly;
查看执行频率最高的 5个动态 SQL
语句:
select NUM_EXECUTIONS, TOTAL_EXEC_TIME/NUM_EXECUTIONS,
STMT_SORTS,
STMT_SORTS/NUM_EXECUTIONSas
SORTS_PER_EXECUTION,
SUBSTR(STMT_TEXT,1,200)AS
STMT_TEXTfromTABLE(
SNAPSHOT_DYN_SQL (CAST(NULLASVARCHAR(1)),
CAST (NULLASINTEGER)))
as SNAPSHOT_DYN_SQLORDERBY
NUM_EXECUTIONSdescfetch
first5 rowsonly;;
查看排序次数最多的 5个动态 SQL
语句:
select STMT_SORTS, STMT_SORTS/NUM_EXECUTIONSas
SORTS_PER_EXECUTION,
substr(STMT_TEXT,1,200)as
STMT_TEXTfromTABLE(
SNAPSHOT_DYN_SQL (CAST(NULLASVARCHAR(1)),
CAST (NULLASINTEGER)))
as SNAPSHOT_DYN_SQLorderby
STMT_SORTSdescfetch
first5 rowsonly;
如果发现了运行成本比较高的SQL,就要来优化这些SQL的执行效率,来降低持有锁的锁产生的资源消耗,进一步降低死锁和锁等待的产生。
相关文章推荐
- 怎么捕获和记录SQL Server中发生的死锁
- 怎么捕获和记录SQL Server中发生的死锁?
- 241 map 在什么情况下会发生死锁;stl 中的 map 是怎么实现的?
- 怎么捕获和记录SQL Server中发生的死锁
- 怎么捕获和记录SQL Server中发生的死锁
- 怎么捕获和记录SQL Server中发生的死锁?
- 怎么捕获和记录SQL Server中发生的死锁?
- 如何减少SQL Server死锁发生的情况
- python alembic upgrade 时发生死锁
- 通过xib加载textfield的时候 发生 this class is not key value coding-compliant for the key textField. 情况怎么解决
- 资源分配之银行家算法(含随机调度算法C++代码,此银行家算法,没考虑死锁的发生)
- qq发生未知错误怎么办_qq发生未知错误怎么处理
- 怎样减少sqlserver中死锁的发生
- JVM调优之jstack找出发生死锁的线程
- C语言笔试题精选3---死锁发生必要条件是?
- 怎么把ShockWaveFlash控件上发生的鼠标右键捕获,并替换成鼠标左键事件
- 如何减少SQL Server死锁发生的情况
- 死锁的发生与处理
- 数据库以及线程发生死锁的原理及必要条件,如何避免死锁
- 如何减少SQL Server死锁发生的情况