为什么我得到这个数据库错误时,我更新表?
第1行错误: ORA-00054:资源繁忙,指定NOWAIT或超时获取
为什么我得到这个数据库错误时,我更新表?
第1行错误: ORA-00054:资源繁忙,指定NOWAIT或超时获取
当前回答
正如在其他回答中提到的,此错误是由在其他会话中运行的并发DML操作引起的。这将导致Oracle无法用默认的NOWAIT选项锁定DDL的表。
对于那些在数据库中没有管理权限或不能杀死/中断其他会话的用户,您还可以在DDL操作之前使用:
alter session set DDL_LOCK_TIMEOUT = 30;
--Run your DDL command, e.g.: alter table, etc.
我在后台作业执行大型插入/更新操作的数据库中反复收到此错误,在会话中更改此参数允许DDL在等待锁几秒钟后继续执行。
有关更多信息,请参阅rshdev对这个答案的注释、oracle-base上的这个条目或DDL_LOCK_TIMEOUT的官方文档。
其他回答
我通过关闭一个IDE选项卡解决了这个问题。
PL / SQL开发人员 版本10.0.5.1710
当资源繁忙时发生此错误。检查查询中是否有任何引用约束。甚至您在查询中提到的表也可能处于繁忙状态。他们可能正在从事其他工作,这些工作肯定会在以下查询结果中列出:
SELECT * FROM V$SESSION WHERE STATUS = 'ACTIVE'
找到SID,
SELECT * FROM V$OPEN_CURSOR WHERE SID = --the id
正如在其他回答中提到的,此错误是由在其他会话中运行的并发DML操作引起的。这将导致Oracle无法用默认的NOWAIT选项锁定DDL的表。
对于那些在数据库中没有管理权限或不能杀死/中断其他会话的用户,您还可以在DDL操作之前使用:
alter session set DDL_LOCK_TIMEOUT = 30;
--Run your DDL command, e.g.: alter table, etc.
我在后台作业执行大型插入/更新操作的数据库中反复收到此错误,在会话中更改此参数允许DDL在等待锁几秒钟后继续执行。
有关更多信息,请参阅rshdev对这个答案的注释、oracle-base上的这个条目或DDL_LOCK_TIMEOUT的官方文档。
您的表已经被某个查询锁定。例如,您可能已经执行了“select For update”,但尚未提交/回滚并触发另一个选择查询。在执行查询之前执行一次提交/回滚。
请关闭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