我杀了一个正在更新表格的脚本。现在当我重新运行我得到的脚本时,
ORA-00054:资源繁忙并获得 用NOWAIT指定
我认为桌子已被锁定?如何解锁桌子?提前谢谢。
答案 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异常时重新运行您的语句。