記一次library cache pin事件解決

qqmengxue發表於2010-12-14

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部落格 ” ,連結:http://blog.itpub.net/10130206/viewspace-1043076/,如需轉載,請註明出處,否則將追究法律責任。

相關文章