ORA-00054与ORA-00942报错咨询:删表及查看会话遇阻
ORA-00054与ORA-00942报错解决指南
问题场景
删除Oracle表时反复触发ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired报错;尝试通过「Monitor Sessions」标签终止锁定会话时,又出现ORA-00942: table or view does not exist;执行以下两条查询锁定对象的SQL语句,同样返回ORA-00942错误:
查询语句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
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;
核心原因
ORA-00942报错的本质是当前登录用户没有访问系统视图/字典表的权限,上述SQL中用到的v$locked_object、v$session、dba_objects等均属于Oracle系统级对象,普通用户默认无查询权限。
解决步骤
获取系统视图访问权限
- 切换至拥有DBA权限的用户(如
sys或system)执行上述查询; - 或给当前用户单独授权(替换
你的用户名为实际用户名):GRANT SELECT ON v$locked_object TO 你的用户名; GRANT SELECT ON v$session TO 你的用户名; GRANT SELECT ON v$process TO 你的用户名; GRANT SELECT ON dba_objects TO 你的用户名; GRANT SELECT ON v$sql TO 你的用户名; - 若需要批量授权系统字典,可执行(权限较大,按需使用):
GRANT SELECT ANY DICTIONARY TO 你的用户名;
- 切换至拥有DBA权限的用户(如
终止锁定会话
成功查询到锁定表的会话信息(SID和SERIAL#)后,执行以下语句终止会话:ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;注意替换语句中的
SID和SERIAL#为查询结果对应值。强制删除表(谨慎使用)
若终止会话后仍无法删除表,可尝试带强制选项的删除命令(会跳过约束检查并直接清理回收站):DROP TABLE 你的表名 CASCADE CONSTRAINTS PURGE;
内容的提问来源于stack exchange,提问作者JurajC
相关产品推荐
相关产品推荐

