ORACLE 10.2.0.4
REDHAT 5.3 32bit
[@more@]
今天开发人员突然报账说编译存储过程的时候一直卡到哪里就死掉了,通过查询发现在event列有一个library cache pin事件一直在等待,得到SID后查询session_wait:
LIBRARY CACHE PIN事件主要是由于管理library cache并发的,当一个object被pin住的话同时这个object会有一个heap载入内存,当用户要修改或者编译这个object的时候这个object的heap就必须要先被pin住,也就是拿到编辑锁,这个事件的等待时间通常为3秒。
library cache pin参数解析:
P1 KGL(kernel general Library ) 地址
P2 pin的地址
P3 100*mode+namespace
其中P1,P2分别和x$kglpn和x$kglob相关联
问题解决:
select sid,event,p1,p2,p3 from v$session_wait where sid=192;
通过以上查询的P1列转换为16进制的,然后将转换后的结果作为X$KGLPN表的KGLPNHDL作为条件进行查询:
select * from x$kglpn t where kglpnhdl = '7D897554';
KGLPNHDL--- Library Cache Handle Address
KGLPNADR--- Library Cache Pin Address.
KGLPNSES---持有锁的session
通过查看KGNMOD列有一个状态为2的,其他的均为0,说明此记录的session持有这个heap的锁,
通过P1列与x$kglob的KGLHDADR进行关联查找出锁住的SQL:
select * from x$kglob where KGLHDADR = '7D897554';
最后查询出持有此锁的sessionID:
select a.sid, a.username, a.program
from v$session a, x$kglpn b
where a.saddr = b.kglpnuse
and b.kglpnhdl like '%7D897554%';
得到SID后去session里面找到对应的记录进行kill:
select * from v$session_wait t where t.SID = 253;
alter system kill session '253,20928';
最后重新执行编译操作,问题解决。