同事在测试库上对一个表加字段,提示 ORA-00054, 资源忙。 应该是表对象的锁没有释放。
用如下SQL 查看一下系统中相关对象上锁的情况:
/* Formattedon2012/2/13 14:24:32 (QP5 v5.185.11230.41888) */
SELECTS.SID SESSION_ID,
S.USERNAME,
DECODE (LMODE,
0,' None ',
1,' Null ',
2,' Row-S(SS) ',
3,' Row-X(SX) ',
4,' Share',
5,'S/Row-X (SSX) ',
6,'Exclusive ',
TO_CHAR (LMODE))
MODE_HELD,
DECODE (REQUEST,
0,' None ',
1,' Null ',
2,' Row-S(SS) ',
3,' Row-X(SX) ',
4,' Share',
5,'S/Row-X (SSX) ',
6,'Exclusive ',
TO_CHAR (REQUEST))
MODE_REQUESTED,
O.OWNER ||' . '|| O.OBJECT_NAME ||' ( '|| O.OBJECT_TYPE ||' ) '
ASOBJECT_NAME,
S.TYPE LOCK_TYPE,
L.ID1 LOCK_ID1,
L.ID2 LOCK_ID2
FROMV$LOCK L, SYS.DBA_OBJECTS O, V$SESSION S
WHEREL.SID = S.SIDANDL.ID1 = O.OBJECT_IDANDobject_name ='xxxx';
/* Formatted on 2012/2/13 14:24:32 (QP5 v5.185.11230.41888) */SELECT S.SID SESSION_ID,
S.USERNAME,
DECODE (LMODE,
0, ' None ',
1, ' Null ',
2, ' Row-S(SS) ',
3, ' Row-X(SX) ',
4, ' Share',
5, 'S/Row-X (SSX) ',
6, 'Exclusive ',
TO_CHAR (LMODE))
MODE_HELD,
DECODE (REQUEST,
0, ' None ',
1, ' Null ',
2, ' Row-S(SS) ',
3, ' Row-X(SX) ',
4, ' Share',
5, 'S/Row-X (SSX) ',
6, 'Exclusive ',
TO_CHAR (REQUEST))
MODE_REQUESTED,
O.OWNER || ' . ' || O.OBJECT_NAME || ' ( ' || O.OBJECT_TYPE || ' ) '
AS OBJECT_NAME,
S.TYPE LOCK_TYPE,
L.ID1 LOCK_ID1,
L.ID2 LOCK_ID2
FROM V$LOCK L, SYS.DBA_OBJECTS O, V$SESSION S
WHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID AND object_name = 'xxxx';

该SQL 显示所有对象上的锁,如果要查某个具体的对象,可以根据OBJECT_NAME 字段进行一下过滤,找到对应的SID 之后去查V$SESSION 视图。
该视图会显示session 对应的信息,包括终端的信息,如果找到了终端,可以让它提交或者回滚一下就OK了。 我这里是测试环境,直接把session kill 掉了。然后修改表就ok了。
SQL>altersystem kill session'SID,SERIAL#'
SQL>alter system kill session 'SID,SERIAL#'
当遇到数据库操作提示ORA-00054资源忙错误时,可以通过查询V$LOCK和V$SESSION视图来定位锁定的对象和会话。通过SQL查询,可以找到持有锁的SID,然后使用ALTER SYSTEM KILL SESSION命令结束会话,从而解锁并解决问题。在测试环境中,直接结束会话是可行的解决方案。
455

被折叠的 条评论
为什么被折叠?



