Oracle 查看 对象 持有锁的情况
同事在测试库上对一个表加字段,提示 ORA-00054, 资源忙。 应该是表对象的锁没有释放。
用如下SQL 查看一下系统中相关对象上锁的情况:
- /*Formattedon2011/9/2614:45:46(QP5v5.163.1008.3004)*/
- SELECTS.SIDSESSION_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.TYPELOCK_TYPE,
- L.ID1LOCK_ID1,
- L.ID2LOCK_ID2
- FROMV$LOCKL,SYS.DBA_OBJECTSO,V$SESSIONS
- WHEREL.SID=S.SIDANDL.ID1=O.OBJECT_ID
该SQL 显示所有对象上的锁,如果要查某个具体的对象,可以根据OBJECT_NAME 字段进行一下过滤,找到对应的SID 之后去查V$SESSION 视图。
该视图会显示session 对应的信息,包括终端的信息,如果找到了终端,可以让它提交或者回滚一下就OK了。 我这里是测试环境,直接把session kill 掉了。然后修改表就ok了。
- SQL>altersystemkillsession'SID,SERIAL#'