Library Cache Pin 是 Oracle 共用池中管理程式單元(PL/SQL 程序、套件、觸發器等)並發存取的關鍵鎖機制。當 Session 需要修改或重編譯一個正在被執行的程式單元時,會發生 library cache pin 等待。本文在 Oracle 10.2.0.5 單實例環境中,完整模擬並分析此等待事件的產生條件、阻塞鏈與診斷方法。
[oracle@localhost ~]$ sqlplus / as sysdba SQL> startup SQL> create user lc0019999 identified by aaaaaa; SQL> grant dba to lc0019999; SQL> create user lc0029999 identified by aaaaaa; SQL> grant dba to lc0029999; SQL> create user lc0039999 identified by aaaaaa; SQL> grant dba to lc0039999; SQL> conn lc0019999/aaaaaa SQL> Create or replace procedure dummy is 2 begin 3 null; 4 end; 5 / SQL> Begin 2 Dummy; 3 Dbms_lock.sleep(1000); 4 End; 5 / ------------> 持續睡眠,持有 Library Cache Pin (Mode 2 = Share)
[oracle@localhost ~]$ sqlplus lc0029999/aaaaaa SQL> alter procedure lc0019999.dummy compile; ------------> 持續 Hang 住,請求 Exclusive Pin (Mode 3)
[oracle@localhost ~]$ sqlplus / as sysdba SQL> set line 200 SQL> select sid, serial#, event from v$session where event like '%library cache pin%'; SID SERIAL# EVENT ---------- ---------- ---------------------------------------------------------------- 158 28 library cache pin SQL> select sid, serial#, p1raw, event from v$session where event like '%library cache pin%'; SID SERIAL# P1RAW EVENT ---------- ---------- ---------------- -------------------------------------------------- 158 28 000000006BFF19B0 library cache pin
SQL> col owner for a30 SQL> col object for a30 SQL> SELECT kglnaown "Owner", kglnaobj "Object" 2 FROM x$kglob 3 WHERE kglhdadr='000000006BFF19B0'; Owner Object ------------------------------ ------------------------------ LC0019999 DUMMY
確認等待發生在 LC0019999.DUMMY 程序上。
SQL> SELECT s.sid, kglpnmod "Mode", kglpnreq "Req" 2 FROM x$kglpn p, v$session s 3 WHERE p.kglpnuse=s.saddr 4 AND kglpnhdl='000000006BFF19B0'; SID Mode Req ---------- ---------- ---------- 158 0 3 <-- 等待者,請求 Exclusive (3) 159 2 0 <-- 持有者,持有 Share (2)
模式對照表:
Session 1 (SID 159) Session 2 (SID 158) ┌─────────────────────────┐ ┌─────────────────────────┐ │ 執行 DUMMY 程序 │ │ ALTER PROCEDURE COMPILE │ │ 持有 Library Cache Pin │───────────▶│ 等待 Library Cache Pin │ │ Mode = 2 (Share) │ 阻塞 │ Req = 3 (Exclusive) │ │ kglpnmod=2, kglpnreq=0 │ │ kglpnmod=0, kglpnreq=3 │ └─────────────────────────┘ └─────────────────────────┘
Library Cache Lock 保護物件定義結構(Handle),Library Cache Pin 保護物件執行體(Heap)。執行 PL/SQL 取 Pin (Share);DDL/重編譯需 Pin (Exclusive)。v$session.p1raw = x$kglob.kglhdadr (Handle Address)x$kglpn.kglpnhdl = Handle Address,連接 v$session.saddr 可得 SIDSELECT_CATALOG_ROLE 或 SYS 權限查詢 x$kglob、x$kglpn。v$mutex_sleep_history、v$library_cache_lock 等新視圖,診斷更便利,但 X$ 核心邏輯不變。library cache pin 等待時間,設定閾值告警。v$session_wait + x$kglpn 定位阻塞鏈,而非盲目 Kill Session。Library Cache Pin 爭用是 PL/SQL 密集型應用的常見效能瓶頸。透過系統化的模擬與 X$ 內部視圖分析,可精準定位阻塞源頭,制定針對性優化策略。掌握 kglhdadr、kglpnhdl、kglpnmod/req 等核心欄位關聯,是高階 DBA 必備技能。