'library cache lock'等待事件的處理方法

zhyuh發表於2005-09-26
'library cache lock'等待事件,可以用如下辦法找到hold lock的那個session。此處只列出了一種方法。[@more@]

1.SQL> desc v$lock;
Name Type Nullable Default Comments
------- ----------- -------- ------- --------
ADDR RAW(4) Y
KADDR RAW(4) Y
SID NUMBER Y
TYPE VARCHAR2(2) Y
ID1 NUMBER Y
ID2 NUMBER Y
LMODE NUMBER Y
REQUEST NUMBER Y
CTIME NUMBER Y
BLOCK NUMBER Y

SQL> select * from v$lock where lmode=6 and type='TM';

如果有結果返回,則檢查相應的sid執行什麼sql:
SQL> select sql_text from v$sqlarea where address=(select sql_address
SQL> from v$session where sid=$SID);
並且檢查什麼物件被鎖住:
select object_id,owner,object_name,object_type from dba_objects where object_id=$ID1;

然後根據sql找原因。

如果沒有結果返回,則表明鎖的原因不是由於DDL操作。繼續如下步驟。

2. 當hang的情況發生時,新開一個session,執行如下SQL生成一個TRACE檔案,位於目錄USER_DUMP_DEST下:
SQL>ALTER SESSION SET EVENTS 'IMMEDIATE TRACE NAME SYSTEMSTATE LEVEL
SQL>10';

用如下SQL找到被鎖住SESSION的PID
SQL> select pid from v$process where addr=(select paddr from v$session
SQL> where sid=$SID);

開啟新生成的TRACE檔案,搜尋 'PROCESS $PID'。
TRACE檔案的示例內容:
PROCESS 8:
----------------------------------------
......
......
O/S info: user: daemon, term: pts/1, ospid: 15160, machine: goblin.forgotten.realms
program:
(TNS V1-V3)
application name: SQL*Plus, hash value=3669949024
waiting for 'library cache lock' blocking sess=0x0 seq=253 wait_time=0
!>> handle address=5023ef9c, lock address=5019cad4, 10*mode+namespace=15

根據 'handle address=5023ef9c', 搜尋'handle=5023ef9c',找到鎖住物件的PID。
再利用PID可以找到鎖住物件的SESSION的SID,USERNAME,SQL等資訊。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/207/viewspace-807089/,如需轉載,請註明出處,否則將追究法律責任。

相關文章