library cache pin和library cache lock的診斷分析
最近執行一個分批刪除資料的procedure,感覺執行比較慢,臨時取消了該job,然後再次重建procedure時,session
hang住了,應該是library cache pin的等待事件了,oracle用兩種結構pin和lock來控制shared pool的併發訪問控制。
訪問一個物件將其pin到記憶體中,在pin之前需要先獲取該物件的handle的鎖定,lock的索引主要有null
share exclusive,當然pin該物件也有上述三種狀態。
Session a :execute delete_data
臨時取消了該procedure的執行,實際程式並沒有馬上釋放該物件的pin
Session b:
SQL> create or
replace procedure delete_data
2 as
3
begin
4 loop
Delete from
TEXTAUTO_FOLDERARTICLE where LASTPOSTDATE
Exit when
sql%notfound;--dml語句中隱式遊標屬性進行控制
Commit;
End loop;
9
Commit;
10 end;
11 /
出現了library cache pin等待事件:
SQL> select
event,count(*) from v$session group by event;
EVENT
COUNT(*)
----------------------------------------------------------------
----------
SQL*Net message
from client
92
library cache
pin
1
jobq slave
wait
1
rdbms ipc
message
10
smon timer
1
pmon timer
1
db file scattered
read 1
Streams AQ: qmn
slave idle wait 1
SQL*Net message to
client
1
Streams AQ: qmn
coordinator idle wait 1
Streams AQ: waiting
for time management or cleanup tasks 1
11 rows selected.
分析一下上述的library cache pin是如何造成的:首先系統執行了該procedure,此時該物件已經被pin到記憶體,佔用了一個share pin和一個null lock,而此時在程式還沒有釋放此pin之前再次create procedure,此時要獲取一個exclusive pin和exclusive
lock,由於之前的share pin和exclusive
pin不共存,此時就會產生一個library cache pin等待。
這裡注意一下兩個基表x$kglpn和x$kgllk,對於解決library cache pin和lock太輕鬆了。
SQL> desc
x$kglpn;
Name
Null? Type
-----------------------------------------
-------- ----------------------------
ADDR
RAW(8)
INDX
NUMBER
INST_ID
NUMBER
KGLPNADR
RAW(8)
KGLPNUSE
RAW(8)
KGLPNSES RAW(8)
KGLPNHDL
RAW(8)
KGLPNLCK
RAW(8)
KGLPNCNT
NUMBER
KGLPNMOD NUMBER
KGLPNREQ
NUMBER
KGLPNDMK
NUMBER
KGLPNSPN
NUMBER
透過等待事件的p1raw引數聯合kglpnhdl來獲取kglpnuse,這裡的kglpnmod和kglpnreq和v$lock的lmode和request基本相同,kglpnmod=2表示此時這個session佔有了library cache pin而造成了kglpnreq=3這個session的等待。
SQL> select
kglpnuse,kglpnhdl,kglpnmod,kglpnreq from x$kglpn where kglpnhdl in (select
p1raw from v$session where event='library cache pin');
KGLPNUSE KGLPNHDL KGLPNMOD
KGLPNREQ
----------------
---------------- ---------- ----------
00000000D8227590
00000000DD876D98 0 3
00000000DA225340
00000000DD876D98 2 0
聯合v$session的saddr來獲取sid然後可以透過v$process來kill掉沒有釋放的程式。
SQL> select
b.spid,a.sid from v$session a,v$process b
where a.saddr in ('00000000DA225340') and a.paddr=b.addr;
SPID SID
------------
----------
11232 195
而如果此時再重新編譯一下該procedure,同樣需要獲取一個該物件的lock鎖定,由於上述重建procedure還在檢視獲取該物件的library
cache lock的exclusive lock,那麼當然此時出現library
cache lock是當然的。
SQL> alter
procedure delete_data compile;
SQL> select
event,count(*) from v$session group by event;
EVENT
COUNT(*)
----------------------------------------------------------------
----------
SQL*Net message
from client
91
library cache
pin
1
jobq slave
wait 1
rdbms ipc
message
10
smon timer
1
pmon timer
1
db file scattered
read
1
library cache
lock
1
Streams AQ: qmn
slave idle wait 1
SQL*Net message to
client 1
Streams AQ: qmn
coordinator idle wait 1
SQL> desc
x$kgllk;
Name
Null? Type
-----------------------------------------
-------- ----------------------------
ADDR
RAW(8)
INDX
NUMBER
INST_ID
NUMBER
KGLLKADR RAW(8)
KGLLKUSE
RAW(8)
KGLLKSES
RAW(8)
KGLLKSNM
NUMBER
KGLLKHDL
RAW(8)
KGLLKPNC
RAW(8)
KGLLKPNS
RAW(8)
KGLLKCNT
NUMBER
KGLLKMOD
NUMBER
KGLLKREQ NUMBER
KGLLKFLG
NUMBER
KGLLKSPN
NUMBER
KGLLKHTB
RAW(8)
KGLNAHSH NUMBER
KGLLKSQLID
VARCHAR2(13)
KGLHDPAR
RAW(8)
KGLHDNSP
NUMBER
USER_NAME
VARCHAR2(30)
KGLNAOBJ
VARCHAR2(60)
獲取blocking session的方法基本相同,也是透過p1raw引數聯合kgllkhdl來獲取kgllkuse,最後聯合v$session來獲取sid,進而透過v$process獲取spid,殺掉程式後即可
SQL> select
kgllkhdl,kgllkuse,kgllkreq,kgllkmod from x$kgllk where kgllkhdl in (Select
p1raw from v$session where event='library cache lock');
KGLLKHDL KGLLKUSE KGLLKREQ KGLLKMOD
----------------
---------------- ---------- ----------
00000000DD876D98
00000000DA225340 0 1
00000000DD876D98
00000000D8227590 0 3
00000000DD876D98
00000000D821FC40 3 0
透過上述的library cache pin和library cache lock等待事件的分析和診斷,可以看出資料字典基表可以提供我們非常的資訊,而幫助解決一些比較棘手的案例,當然上述我們也可以利用oradebug然後透過trace檔案來診斷,不過相對trace檔案較難以閱讀,需要一定的功底,後續如果有對該等待事件trace的解決案例再拿出來與大家分享。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1059119/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Library Cache Pin 及 Library Cache Lock分析
- library cache lock和library cache pin理解
- library cache lock和library cache pin區別總結
- zt_library cache pin和lock等待分析
- zt_如何平面解決library cache lock和library cache pin
- 定位Library Cache pin,Library Cache lock等待的解決方法
- oracle library cache之library cache lock_library cache pin wait event釋義OracleAI
- enq:Library cache lock/pin等待事件ENQ事件
- Library cache lock/pin詳解(轉)
- zt_如何使用event 10049分析定位library cache lock and library cache pin
- library cache pin等待分析
- library cache pin/lock的解決辦法
- library cache lock和cursor: pin S wait on X等待AI
- library cache lock\pin的查詢與處理
- [20240824]跟蹤library cache lock library cache pin使用gdb.txt
- 【等待事件】library cache pin事件
- 等待事件--library cache pin事件
- library cache pin 等待事件事件
- 0317Library Cache Pin/Lock Wait EventsAI
- sql version count引發cursor:pin s wait x及library cache latch library cache lockSQLAI
- [20240920]跟蹤library cache lock library cache pin使用gdb.txt
- Shared pool的library cache lock/pin及硬解析
- 分析解決因”library cache pin”等待
- 【ASK_ORACLE】Library cache pin 與 library load lock的關係和區別Oracle
- oracle11g之v$libcache_locks處理library cache lock及library cache pinOracle
- LIBRARY CACHE LOCK 等待事件事件
- Library cache pin/lock 在Oracle 10g的增強Oracle 10g
- 【ASK_ORACLE】Library Cache概念篇(二)之Library Cache Pin的定義Oracle
- 11G資料庫之library cache lock及library cache pin模擬結合hanganalyze定位資料庫
- latch:library cache lock等待事件事件
- oracle異常:library cache lockOracle
- 解決library cache pin等待事件事件
- library cache pin 阻塞程式查詢
- 查詢Library Cache Pin等待原因
- 常用定位library cache lock的方法
- library cache pin等待事件的模擬事件
- 一次library cache lock 問題分析
- [20241105]跟蹤library cache lock library cache pin使用gdb(11g)2.txt