1。解决思路
当出现library cache pin时,首先要查找到
(1)持有锁的sid。
(2)正在等待pin的sid
(3)正在被pin的object
要查到以上信息,需要查询x$kglpn k,v$session ,v$session_wait,x$kglob 这几个视图。
2.模拟试验
session 1:
scott@TEST>select sid from v$mystat where rownum=1;
SID
----------
12
scott@TEST>create or replace PROCEDURE pining
2 is
3 begin
4 null;
5 end;
6 /
Procedure created.
scott@TEST>create or replace procedure calling
2 is
3 begin
4 pining;
5 dbms_lock.sleep(6000);
6 end;
7 /
Procedure created.
scott@TEST>exec calling;
此时,sid为12的session持有了library cache pin的锁,并且在一段时间内不释放
session 2:
scott@TEST>select sid from v$mystat where rownum=1;
SID
----------
17
scott@TEST>create or replace PROCEDURE pining
2 is
3 begin
4 null;
5 end;
6 /
此session被挂起,等待linbrary cache pin的锁资源。
session 3:
idle>select s.sid,s.username,k.kglpnuse,k.kglpnhdl,k.kglpnmod,k.kglpnreq,ob.kglnaobj
from x$kglpn k ,v$session s,v$session_wait w,x$kglob ob
where s.saddr=k.kglpnuse and w.p1raw=k.kglpnhdl and w.event like 'lib%' and ob.KGLHDADR=w.p1raw; 2 3
SID USERNAME KGLPNUSE KGLPNHDL KGLPNMOD KGLPNREQ KGLNAOBJ
---------- ------------------------------ -------- -------- ---------- ---------- ------------------------------
12 SCOTT 551EF7A4 56BAFE30 2 0 PINING
17 SCOTT 551F26C0 56BAFE30 0 3 PINING
可以看出,sid为12的session已经持有了library cache pin的锁,而sid为17的session正在等待pin。通过上述sql,就可以准确的定位持有锁的session和正在等待锁的session以及相应的object。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10972173/viewspace-473076/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10972173/viewspace-473076/