我杀死了一个正在更新表格的脚本。现在,当我重新运行我得到的脚本时,
ORA-00054: 资源繁忙并使用指定的 NOWAIT 获取
我想桌子被锁定了?如何解锁表?提前致谢。
步骤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
感谢信息用户'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;
你必须等一下。被杀死的会话处于事务中间并更新了许多记录。这些记录必须回滚,并且一些后台进程正在处理这个问题。同时,您无法修改已触及的记录。
当您终止会话时,会话会在“KILLED”状态下挂起一段时间,而 Oracle 会在它之后进行清理。
如果您绝对必须,您也可以终止操作系统进程(查找v$process.spid
),这将释放它持有的任何锁。
有关更多详细信息,请参阅此内容。
根据您的情况,被锁定的表可能只是正常操作的一部分,您不想仅仅终止阻塞事务。您想要做的是让您的语句等待其他资源。Oracle 11g 有 DDL 超时,可以设置来处理这个问题。
如果您正在处理 10g,那么您必须更有创意并编写一些 PL/SQL 来处理重试。查看在Oracle 10g 中绕过 ORA-00054 这会在发生 resource_busy 异常时重新运行您的语句。