ITPub博客

首页 > 数据库 > Oracle > 记一次library cache pin事件解决

记一次library cache pin事件解决

原创 Oracle 作者:qqmengxue 时间:2010-12-14 14:15:41 0 删除 编辑

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';
最后重新执行编译操作,问题解决。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10130206/viewspace-1043076/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: oracle调用C动态库
请登录后发表评论 登录
全部评论

注册时间:2009-03-26

  • 博文量
    169
  • 访问量
    589157