ORA-00054:资源繁忙并且使用NOWAIT指定获取

时间:2010-06-19 14:00:23

标签: sql oracle unix ora-00054

我杀了一个正在更新表格的脚本。现在当我重新运行我得到的脚本时,

  

ORA-00054:资源繁忙并获得   用NOWAIT指定

我认为桌子已被锁定?如何解锁桌子?提前谢谢。

5 个答案:

答案 0 :(得分:59)

第1步:

select object_name, s.sid, s.serial#, p.spid 
from v$locked_object l, dba_objects o, v$session s, v$process p
where l.object_id = o.object_id and l.session_id = s.sid and s.paddr = p.addr;

第2步:

alter system kill session 'sid,serial#'; --`sid` and `serial#` get from step 1

更多信息:http://www.oracle-base.com/articles/misc/killing-oracle-sessions.php

答案 1 :(得分:8)

你必须等待。被杀的会话是在事务中间并更新了大量记录。这些记录必须回滚,一些后台进程正在处理。在此期间,您无法修改被触摸的记录。

答案 2 :(得分:8)

感谢信息用户'user712934'

您还可以查找sql​​,用户名,机器,端口信息并进入保存连接的实际进程

SELECT O.OBJECT_NAME, S.SID, S.SERIAL#, P.SPID, S.PROGRAM,S.USERNAME,
S.MACHINE,S.PORT , S.LOGON_TIME,SQ.SQL_FULLTEXT 
FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S, 
V$PROCESS P, V$SQL SQ 
WHERE L.OBJECT_ID = O.OBJECT_ID 
AND L.SESSION_ID = S.SID AND S.PADDR = P.ADDR 
AND S.SQL_ADDRESS = SQ.ADDRESS;

答案 3 :(得分:6)

当你杀死会话时,会话会以“KILLED”状态挂起一段时间,而Oracle会在其后清理。

如果你绝对必须,你也可以杀死操作系统进程(查找v$process.spid),这将释放它所持有的任何锁。

有关详细信息,请参阅this

答案 4 :(得分:3)

根据您的具体情况,被锁定的桌子可能只是正常操作的一部分。你不想只是杀死阻塞事务。 您要做的是让您的语句等待其他资源。 Oracle 11g has DDL timeouts which can be set处理这个问题。

如果您正在处理10g,那么您必须获得更多创意,并编写一些PL / SQL来处理重试。查看Getting around ORA-00054 in Oracle 10g这会在发生resource_busy异常时重新运行您的语句。