为什么我得到这个数据库错误时,我更新表?
第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的官方文档。
其他回答
您的表已经被某个查询锁定。例如,您可能已经执行了“select For update”,但尚未提交/回滚并触发另一个选择查询。在执行查询之前执行一次提交/回滚。
您的问题看起来像是混合了DML和DDL操作。请看这个URL,它解释了这个问题:
http://www.orafaq.com/forum/t/54714/2/
正如在其他回答中提到的,此错误是由在其他会话中运行的并发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的官方文档。
只需检查持有会话的进程并杀死它。一切恢复正常。
在SQL下面可以找到您的流程
SELECT s.inst_id,
s.sid,
s.serial#,
p.spid,
s.username,
s.program FROM gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id;
然后杀死它
ALTER SYSTEM KILL SESSION 'sid,serial#'
OR
我在网上找到的一些例子似乎也需要实例id 删除系统会话:
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;