为什么我得到这个数据库错误时,我更新表?
第1行错误: ORA-00054:资源繁忙,指定NOWAIT或超时获取
为什么我得到这个数据库错误时,我更新表?
第1行错误: ORA-00054:资源繁忙,指定NOWAIT或超时获取
当前回答
当资源繁忙时发生此错误。检查查询中是否有任何引用约束。甚至您在查询中提到的表也可能处于繁忙状态。他们可能正在从事其他工作,这些工作肯定会在以下查询结果中列出:
SELECT * FROM V$SESSION WHERE STATUS = 'ACTIVE'
找到SID,
SELECT * FROM V$OPEN_CURSOR WHERE SID = --the id
其他回答
我也面临着类似的问题。程序员不需要做任何事情来解决这个错误。我通知了我的oracle DBA团队。他们扼杀了会议,并像一个魅力。
就我而言,我很确定这是我自己的一个会话阻塞了。因此,这样做是安全的:
我发现了这个令人不快的环节: SELECT * FROM V$SESSION WHERE OSUSER='my_local_username' 会话处于非活动状态,但它仍然以某种方式持有锁。注意,在你的情况下,你可能需要使用一些其他的WHERE条件(例如,尝试USERNAME或MACHINE字段)。 使用上面获取的ID和SERIAL#杀死会话: 修改系统会话id为>,序列号为>
由@thermz编辑:如果前面的开放会话查询都不起作用,请尝试这个查询。这个查询可以帮助你在杀死会话时避免语法错误:
SELECT 'ALTER SYSTEM KILL SESSION ''||SID||','||SERIAL#||'' immediate;' FROM V$SESSION WHERE OSUSER='my_local_username_on_OS'
您的问题看起来像是混合了DML和DDL操作。请看这个URL,它解释了这个问题:
http://www.orafaq.com/forum/t/54714/2/
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;
我有这个错误发生时,我有2个脚本,我正在运行。我有:
SQL*Plus会话直接使用模式用户帐户(帐户#1)连接 另一个SQL*Plus会话使用不同的模式用户帐户(帐户#2)连接,但作为第一个帐户跨数据库链接连接
我运行了一个表删除,然后创建表作为帐户#1。 我对账号2的会话进行了表更新。没有提交更改。 以帐户#1的身份重新运行表删除/创建脚本。删除表x命令出错。
我通过运行COMMIT来解决这个问题;在账号#2的SQL*Plus会话中。