ITPub博客

首页 > 应用开发 > IT综合 > 'library cache lock'等待事件的处理方法

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

原创 IT综合 作者:zhyuh 时间:2005-09-26 10:08:48 0 删除 编辑
'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:
sqlplus@goblin.forgotten.realms (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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    233
  • 访问量
    2008662