29

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

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

我想桌子被锁定了?如何解锁表?提前致谢。

4

5 回答 5

63

步骤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

于 2011-09-23T07:19:06.003 回答
11

感谢信息用户'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;
于 2012-08-10T03:17:05.797 回答
8

你必须等一下。被杀死的会话处于事务中间并更新了许多记录。这些记录必须回滚,并且一些后台进程正在处理这个问题。同时,您无法修改已触及的记录。

于 2010-06-19T15:26:54.697 回答
6

当您终止会话时,会话会在“KILLED”状态下挂起一段时间,而 Oracle 会在它之后进行清理。

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

有关更多详细信息,请参阅此内容。

于 2010-06-20T06:47:04.757 回答
3

根据您的情况,被锁定的表可能只是正常操作的一部分,您不想仅仅终止阻塞事务。您想要做的是让您的语句等待其他资源。Oracle 11g 有 DDL 超时,可以设置来处理这个问题。

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

于 2015-12-27T15:07:10.113 回答