暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

关于library cache pin几个脚本测试

原创 _ 云和恩墨 2022-12-01
542

– session 1

Create or replace procedure dummy is
begin
null;
end;
/

--session 1
Begin
Dummy;
Dbms_lock.sleep(1000);
End;
/

–session 2

alter procedure dummy compile;

–session 3 以下均session 3

select sid, event, p1raw from v$session_wait where event = 'library cache pin';

       SID EVENT                                              P1RAW
---------- -------------------------------------------------- ----------------
        19 library cache pin                                  000000006222D828
--19在等待000000006222D828句柄
col KGLNAOWN for a30
col KGLNAOBJ for a40
select kglnaown, kglnaobj from x$kglob where kglhdadr = '000000006222D828';
KGLNAOWN                       KGLNAOBJ
------------------------------ ----------------------------------------
SYS                            DUMMY
--目前持有者

select kglhdadr, kglnaown, kglnaobj from x$kglob where kglnaobj = 'DUMMY';
KGLHDADR         KGLNAOWN                       KGLNAOBJ
---------------- ------------------------------ ----------------------------------------
000000006222D828 SYS                            DUMMY
000000006222C0C8 PUBLIC                         DUMMY
select sid, serial#,s.event, sql_text from dba_kgllock w, v$session s, v$sqlarea a 
where w.kgllkuse = s.saddr and w.kgllkhdl='000000006222D828' 
and s.sql_address = a.address 
and s.sql_hash_value = a.hash_value;

       SID    SERIAL# EVENT                          SQL_TEXT
---------- ---------- ------------------------------ ------------------------------------------------------------
        21      15126 PL/SQL lock timer              Begin Dummy; Dbms_lock.sleep(1000); End;
        19      52287 library cache pin              alter procedure dummy compile
        19      52287 library cache pin              alter procedure dummy compile
        21      15126 PL/SQL lock timer              Begin Dummy; Dbms_lock.sleep(1000); End;
--21在锁定,19在等待 
SELECT *
    FROM v$session_wait
   WHERE event = 'library cache pin'
ORDER BY p1raw;

SELECT kglnaown "Owner", kglnaobj "Object"
  FROM x$kglob
 WHERE kglhdadr = '000000006222D828';

Owner                          Object
------------------------------ --------------------
SYS                            DUMMY
--持有者信息
--查找session 
SELECT DECODE (lob.kglobtyp,
                 0, 'NEXT OBJECT',
                 1, 'INDEX',
                 2, 'TABLE',
                 3, 'CLUSTER',    
                 4, 'VIEW',
                 5, 'SYNONYM',
                 6, 'SEQUENCE',
                 7, 'PROCEDURE',
                 8, 'FUNCTION',
                 9, 'PACKAGE',
                 11, 'PACKAGE BODY',
                 12, 'TRIGGER',
                 13, 'TYPE',
                 14, 'TYPE BODY',
                 19, 'TABLE PARTITION',
                 20, 'INDEX PARTITION',
                 21, 'LOB',
                 22, 'LIBRARY',
                 23, 'DIRECTORY',
                 24, 'QUEUE',
                 28, 'JAVA SOURCE',
                 29, 'JAVA CLASS',
                 30, 'JAVA RESOURCE',
                 32, 'INDEXTYPE',
                 33, 'OPERATOR',
                 34, 'TABLE SUBPARTITION',
                 35, 'INDEX SUBPARTITION',
                 40, 'LOB PARTITION',
                 41, 'LOB SUBPARTITION',
                 42, 'MATERIALIZED VIEW',
                 43, 'DIMENSION',
                 44, 'CONTEXT',
                 46, 'RULE SET',
                 47, 'RESOURCE PLAN',
                 48, 'CONSUMER GROUP',
                 51, 'SUBSCRIPTION',
                 52, 'LOCATION',
                 55, 'XML SCHEMA',
                 56, 'JAVA DATA',
                 57, 'SECURITY PROFILE',
                 59, 'RULE',
                 62, 'EVALUATION CONTEXT',
                 'UNDEFINED')
            object_type,
         lob.KGLNAOBJ object_name,
         pn.KGLPNMOD lock_mode_held,
         pn.KGLPNREQ lock_mode_requested,
         ses.sid,
         ses.serial#,
         ses.username
    FROM x$kglpn pn,
         v$session ses,
         x$kglob lob,
         v$session_wait vsw
   WHERE     pn.KGLPNUSE = ses.saddr
         AND pn.KGLPNHDL = lob.KGLHDADR
         AND lob.kglhdadr = vsw.p1raw
         AND vsw.event = 'library cache pin'
ORDER BY lock_mode_held DESC; 

OBJECT_TYPE                    OBJECT_NAME                    LOCK_MODE_HELD LOCK_MODE_REQUESTED        SID    SERIAL# USERNAME
------------------------------ ------------------------------ -------------- ------------------- ---------- ---------- --------------------
PROCEDURE                      DUMMY                                       2                   0         21      15126 SYS
PROCEDURE                      DUMMY                                       0                   3         19      52287 SYS
--21拿着2号共享锁,19号请求3号排他锁

SELECT DISTINCT DECODE(KGLPNREQ,
                       0,
                       'holding_session:' || S.SID,
                       'waiting_session: ' || S.SID) SID,
                S.SERIAL#,
                KGLPNMOD "Pin Mode",
                KGLPNREQ "ReqPin",
                A.SQL_TEXT,
                KGLNAOWN "Owner",
                KGLNAOBJ "Object"
  FROM X$KGLPN P, V$SESSION S, V$SQLAREA A, V$SESSION_WAIT SW, X$KGLOB X
 WHERE P.KGLPNUSE = S.SADDR
   AND KGLPNHDL = SW.P1RAW
   AND KGLHDADR = SW.P1RAW
   AND s.EVENT LIKE 'library cache%'
   AND (A.HASH_VALUE, A.ADDRESS) IN
       (SELECT DECODE(SQL_HASH_VALUE, 0, PREV_HASH_VALUE, SQL_HASH_VALUE),
               DECODE(SQL_HASH_VALUE, 0, PREV_SQL_ADDR, SQL_ADDRESS)
          FROM V$SESSION S2
         WHERE S2.SID = S.SID);
		 
SID                               SERIAL#   Pin Mode     ReqPin SQL_TEXT                                 Owner      Object
------------------------------ ---------- ---------- ---------- ---------------------------------------- ---------- ------------------------------
waiting_session: 19                 52287          0          3 alter procedure dummy compile            SYS        DUMMY
--等待者是19,用的命令是alter,亲求3号 
SELECT DISTINCT /*+ ordered */ W1.SID WAITING_SESSION,
                H1.SID HOLDING_SESSION,
                W.KGLLKTYPE LOCK_OR_PIN,
                OD.TO_OWNER OBJECT_OWNER,
                OD.TO_NAME OBJECT_NAME,
                OC.TYPE,
                DECODE(H.KGLLKMOD,
                       0,
                       'None',
                       1,
                       'Null',
                       2,
                       'Share',
                       3,
                       'Exclusive',
                       'Unknown') MODE_HELD,
                DECODE(W.KGLLKREQ,
                       0,
                       'None',
                       1,
                       'Null',
                       2,
                       'Share',
                       3,
                       'Exclusive',
                       'Unknown') MODE_REQUESTED,
                XW.KGLNAOBJ WAIT_SQL,
                XH.KGLNAOBJ HOLD_SQL
  FROM DBA_KGLLOCK         W,
       DBA_KGLLOCK         H,
       V$SESSION           W1,
       V$SESSION           H1,
       V$OBJECT_DEPENDENCY OD,
       V$DB_OBJECT_CACHE   OC,
       X$KGLLK             XW,
       X$KGLLK             XH
 WHERE (((H.KGLLKMOD != 0) AND (H.KGLLKMOD != 1) AND
       ((H.KGLLKREQ = 0) OR (H.KGLLKREQ = 1))) AND
       (((W.KGLLKMOD = 0) OR (W.KGLLKMOD = 1)) AND
       ((W.KGLLKREQ != 0) AND (W.KGLLKREQ != 1))))
   AND W.KGLLKTYPE = H.KGLLKTYPE
   AND W.KGLLKHDL = H.KGLLKHDL
   AND W.KGLLKUSE = W1.SADDR
   AND H.KGLLKUSE = H1.SADDR
   AND OD.TO_ADDRESS = W.KGLLKHDL
   AND OD.TO_NAME = OC.NAME
   AND OD.TO_OWNER = OC.OWNER
   AND W1.SID = XW.KGLLKSNM
   AND H1.SID = XH.KGLLKSNM
   AND (W1.SQL_ADDRESS = XW.KGLHDPAR AND W1.SQL_HASH_VALUE = XW.KGLNAHSH)
   AND (H1.SQL_ADDRESS = XH.KGLHDPAR AND H1.SQL_HASH_VALUE = XH.KGLNAHSH);		 

WAITING_SESSION HOLDING_SESSION LOCK OBJECT_OWNER         OBJECT_NAME                    TYPE                 MODE_HELD MODE_REQU WAIT_SQL                                 HOLD_SQL
--------------- --------------- ---- -------------------- ------------------------------ -------------------- --------- --------- ---------------------------------------- --------------------
             19              21 Pin  SYS                  DUMMY                          PROCEDURE            Share     Exclusive alter procedure dummy compile            Begin Dummy; Dbms_lo
--等待者是19,持有者是21,请求Exclusive,用命令alert,对象是alter                                                                                                                                                                           ck.sleep(1000); End;

SELECT DISTINCT SID USING_SID,
S.SERIAL#,
KGLPNMOD “Pin Mode”,
KGLPNREQ “Req Pin”,
kglnaown"Owner",
KGLNAOBJ “using_Object”
FROM XKGLPNP,VKGLPN P, VSESSION S, X$KGLOB X
WHERE P.KGLPNUSE = S.SADDR
AND KGLPNHDL = KGLHDADR
AND P.KGLPNUSE = S.SADDR
AND KGLPNREQ = 0
AND UPPER(KGLNAOBJ) = UPPER(’&obj’);

USING_SID SERIAL# Pin Mode Req Pin Owner using_Object


    21      15126          2          0 SYS        DBMS_LOCK
    21      15126          2          0 SYS        DUMMY

–编译前检查有没有人持有

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论