Oracle ORA-04020锁死问题,请帮忙分析,并给出解决方法,小女子在此谢过!

ORA-04020: 尝试锁定物件 $BUILD$.1d0cd2c1 时侦测到锁死
object waiting waiting blocking blocking
handle session lock mode session lock mode
0x4cf965010 0x4a16d34f0 0x4cdf3a8f0 X 0x4a147d6d0 0x4ce165900 S
0x4cf965010 0x4d1560938 0x4cd6b5b90 X 0x4a148bf00 0x4cdbd9168 S
0x4cf965010 0x4a147d6d0 0x4ce165900 S 0x4d1560938 0x4cd6b5b90 0
---------- DUMP OF WAITING AND BLOCKING LOCKS ----------
------------- WAITING LOCK -------------
SO: 0x4cdf3a8f0, type: 74, owner: 0x4d6f25460, flag: INIT/-/-/0x00 if: 0x3 c: 0x3
proc=0x4d1264e70, name=LIBRARY OBJECT LOCK, file=kgl.h LINE:8348, pg=0
LibraryObjectLock: Address=cdf3a8f0 Handle=cf965010 RequestMode=X CanBeBrokenCount=1 Incarnation=1 ExecutionCount=0
User=a16d34f0 Session=a16d34f0 ReferenceCount=1 Flags=CNB/[0301] SavepointNum=37
LibraryHandle: Address=cf965010 Hash=b01d2398 LockMode=S PinMode=0 LoadLockMode=0 Status=0

第1个回答  2015-01-16
1)用dba用户执行以下语句

select username,lockwait,status,machine,programfrom v$session where sid in
(select session_id from v$locked_object);

如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明:
Username:死锁语句所用的数据库用户;
Lockwait:死锁的状态,如果有内容表示被死锁。
Status: 状态,active表示被死锁
Machine: 死锁语句所在的机器。
Program: 产生死锁的语句主要来自哪个应用程序

2)用dba用户执行以下语句,可以查看到被死锁的语句。

select sql_text from v$sql where hash_valuein (select sql_hash_value from v$session where sid in
(select session_id from v$locked_object));

四、死锁的解决方法
一般情况下,只要将产生死锁的语句提交就可以了,但是在实际的执行过程中。用户可能不知道产生死锁的语句是哪一句。可以将程序关闭并重新启动就可以了。经常在Oracle的使用过程中碰到这个问题,所以也总结了一点解决方法。

1)查找死锁的进程:
SELECTs.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESSFROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;

2)kill掉这个死锁的进程:
alter system kill session ‘sid,serial#’; (其中sid=l.session_id)

3)如果还不能解决:
select pro.spid from v$sessionses,v$process pro where ses.sid=XX and ses.paddr=pro.addr;

其中XX用死锁的sid替换:
ps -ef|grep spid

其中spid是这个进程的进程号,kill掉这个Oracle进程
select A.SQL_TEXT, B.USERNAME, C.OBJECT_ID,C.SESSION_ID, B.SERIAL#,C.ORACLE_USERNAME,C.OS_USER_NAME,C.Process,''''||C.Session_ID||','||B.SERIAL#||'''from v$sql A, v$session B, v$locked_object C where A.HASH_VALUE =B.SQL_HASH_VALUE and B.SID = C.Session_ID本回答被网友采纳
相似回答