经常会遇到这样的问题,开发人员告诉DBA,说在数据库端可能有锁,想让找到哪个SQL引起的锁
第一步是查看请求锁和持有锁的应用,通过执行一个SQL
SELECT req_application_handle,lock_name, hld_member, lock_status, hld_application_handle FROM TABLE (MON_GET_APPL_LOCKWAIT(NULL, -2))
输出示例
REQ_APPLICATION_HANDLE LOCK_NAME HLD_MEMBER LOCK_STATUS HLD_APPLICATION_HANDLE
---------------------- -------------------------- ---------- ----------- ----------------------
35925 00020102000000000000000452 0 W 35917
想看两个application的详细信息,可以使用db2pd命令看一下
db2pd -db xxxxxxx -apinfo 35925
db2pd -db xxxxxxx -apinfo 35917
但是只能看到request的app的sql详细信息,那个lock holder的看不到了
可以使用其他的db2pd来看lock holder的sql
db2pd -applications查看Anch的信息
$ db2pd -db TXDB -applications 35925
Address AppHandl [nod-index] NumAgents CoorEDUID Status C-AnchID C-StmtUID L-AnchID L-StmtUID Appid WorkloadID WorkloadOccID CollectActData CollectActPartition CollectSectionActuals
0x0780000003170080 35925 [000-35925] 1 16914 Lock-wait 493 1 0 0 *LOCAL.db2inst1.151118081726 1 192 N C N
$ db2pd -db TXDB -applications 35917
Address AppHandl [nod-index] NumAgents CoorEDUID Status C-AnchID C-StmtUID L-AnchID L-StmtUID Appid WorkloadID WorkloadOccID CollectActData CollectActPartition CollectSectionActuals
0x0780000003160080 35917 [000-35917] 1 12037 UOW-Waiting 0 0 41 1 *LOCAL.db2inst1.151118081634 1 191 N C N
根据获取的anch的值,使用以下两个db2pd命令获取执行的sql信息
db2pd -db TXDB -dynamic anch=493
db2pd -db TXDB -dynamic anch=41