1)get p1raw of 'library cache pin'
SELECT sid, event, p1raw, seconds_in_wait, wait_time
FROM v$session_wait
WHERE event = 'library cache pin'
AND state = 'WAITING'
order by p1raw
2)which session hold the object
select a.sid,a.SERIAL#,a.username,a.program
from v$session a,x$kglpn b
where a.saddr=b.kglpnuse and b.kglpnhdl = 'C0000000222B8728' and b.KGLPNMOD<>0
3)what does the session do.
select username,program from v$session where sid=&SID;
select c.SQL_TEXT
from v$sqlarea c, v$session d
where c.ADDRESS= d.SQL_ADDRESS
and d.sid=&SID;
+++++++++++++++++Example++++++++++++++++++
SQL> SELECT sid, event, p1raw, seconds_in_wait, wait_time
2 FROM v$session_wait
3 WHERE event = 'library cache pin'
4 AND state = 'WAITING'
5 order by p1raw
6 ;
SID EVENT P1RAW SECONDS_IN_WAIT WAIT_TIME
---------- ---------------------------------------------------------------- -------- --------------- ----------
126 library cache pin 3C29DD94 539 0
193 library cache pin 3C29DD94 11094 0
SQL>
SQL> select a.sid,a.SERIAL#,a.username,a.program
2 from v$session a,x$kglpn b
3 where a.saddr=b.kglpnuse and b.kglpnhdl = '3C29DD94' and b.KGLPNMOD<>0
4 ;
SID SERIAL# USERNAME PROGRAM
---------- ---------- ------------------------------ ----------------------------------------------------------------
24 1561 BCOE_1 Bcod101A.exe
SQL>
SQL> select c.SQL_TEXT
2 from v$sqlarea c, v$session d
3 where c.ADDRESS= d.SQL_ADDRESS
4 and d.sid=24;
SQL_TEXT
--------------------------------------------------------------------------------
SQL> alter system kill session '24,1561';
+++++++++++++++
不同的操作会对对象请求不同的lock/pin
1、所有的DDL都会对被处理的对象请求排他类型的lock和pin
2、当要对一个过程或者函数进行编译时,需要在library cache中pin该对象。在pin该对象以前,需要获得该对象handle的锁定,如果获取失败,就会产生library cache lock等待。如果成功获取handle的lock,则继续在library cache中pin该对象,如果pin对象失败,则会产生library cache pin等待。
如果是存储过程或者函数,可以这样认为:如果存在library cache lock等待,则一定存在library cache pin等待;反过来,如果存在library cache pin等待,不一定会存在library cache lock等待;
但如果是表引起的,则一般只有library cache lock等待,则不一定存在library cache pin。
可能发生library cache pin和library cache lock的情况:
1、在存储过程或者函数正在运行时被编译。
2、在存储过程或者函数正在运行时被对它们进行授权、或者移除权限等操作。
3、对某个表执行DDL期间,有另外的会话对该表执行DML或者DDL。
4、PL/SQL对象之间存在复杂的依赖性
每个想使用或修改已经locked/pin的对象的SQL语句,将会等待事件'library cache pin'或'library cache lock'直到超时.
超时,通常发生在5分钟后,然后SQL语句会出现ORA-4021的错误.如果发现死锁,则会出现ORA-4020错误。
"library cache pin" 是用来管理library cache的并发访问的,pin一个object会引起相应的heap被
载入内存中(如果此前没有被加载),Pins可以在三个模式下获得:NULL,SHARE,EXCLUSIVE,可以认为pin是一种特定
形式的锁.
当Library Cache Pin等待事件出现时,通常说明该Pin被其他用户已非兼容模式持有.
"library cache pin"的等待时间为3秒钟,其中有1秒钟用于PMON后台进程,即在取得pin之前最多等待3秒钟,否则就超时.
"library cache pin"的参数如下,有用的主要是P1和P2:
P1 - KGL Handle address.
P2 - Pin address
P3 - Encoded Mode & Namespace
"LIBRARY CACHE PIN"通常是发生在编译或重新编译PL/SQL,VIEW,TYPES等object时.编译通常都是显性的,
如安装应用程序,升级,安装补丁程序等,另外,"ALTER","GRANT","REVOKE"等操作也会使object变得无效,
可以通过object的"LAST_DDL"观察这些变化.
当object变得无效时,Oracle 会在第一次访问此object时试图去重新编译它,如果此时其他session已经把此object pin
到library cache中,就会出现问题,特别时当有大量的活动session并且存在较复杂的dependence时.在某种情况下,重新
编译object可能会花几个小时时间,从而阻塞其它试图去访问此object的进程.
阅读(943) | 评论(0) | 转发(0) |