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博客 ” ,链接:https://blog.itpub.net/207/viewspace-807089/ ,如需转载,请注明出处,否则将追究法律责任。