为什么我得到这个数据库错误时,我更新表?
第1行错误: ORA-00054:资源繁忙,指定NOWAIT或超时获取
为什么我得到这个数据库错误时,我更新表?
第1行错误: ORA-00054:资源繁忙,指定NOWAIT或超时获取
当前回答
当用于修改表的会话以外的会话持有锁时,就会发生这种情况,可能是因为DML(更新/删除/插入)。如果您正在开发一个新系统,您或您的团队中的某个人很可能会发出更新语句,您可能会在没有太大后果的情况下终止会话。或者,一旦知道谁打开了会话,就可以从该会话提交。
如果您可以访问SQL管理系统,请使用它来查找违规会话。也许还会杀死它。
你可以使用v$session和v$lock等,但我建议你谷歌如何找到该会话,然后如何杀死它。
在生产系统中,这确实取决于情况。对于oracle 10g或更老的版本,您可以执行
LOCK TABLE mytable in exclusive mode;
alter table mytable modify mycolumn varchar2(5);
在一个单独的会议,但准备好以下,以防太长时间。
alter system kill session '....
这取决于你使用的是什么系统,旧的系统更有可能每次都不提交。这是一个问题,因为可能会有长时间的锁。因此,您的锁将阻止任何新的锁,并等待一个不知道何时释放的锁。这就是为什么你准备了另一个声明。或者你也可以寻找可以自动完成类似任务的PLSQL脚本。
在版本11g中,有一个新的环境变量用于设置等待时间。我认为它可能与我所描述的类似。请注意,锁定问题不会消失。
ALTER SYSTEM SET ddl_lock_timeout=20;
alter table mytable modify mycolumn varchar2(5);
最后,最好等到系统中用户较少时再进行这种维护。
其他回答
我通过关闭一个IDE选项卡解决了这个问题。
PL / SQL开发人员 版本10.0.5.1710
您的表已经被某个查询锁定。例如,您可能已经执行了“select For update”,但尚未提交/回滚并触发另一个选择查询。在执行查询之前执行一次提交/回滚。
您的问题看起来像是混合了DML和DDL操作。请看这个URL,它解释了这个问题:
http://www.orafaq.com/forum/t/54714/2/
请关闭Oracle会话
使用下面的查询来检查活动会话信息
SELECT
O.OBJECT_NAME,
S.SID,
S.SERIAL#,
P.SPID,
S.PROGRAM,
SQ.SQL_FULLTEXT,
S.LOGON_TIME
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;
杀死像
alter system kill session 'SID,SERIAL#';
(例如,alter system kill session '13,36543';)
参考 http://abeytom.blogspot.com/2012/08/finding-and-fixing-ora-00054-resource.html
ORA-00054:资源繁忙,指定NOWAIT获取
您还可以查找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;