Oracle 查看 对象 持有锁的情况

同事在测试库上对一个表加字段,提示 ORA-00054, 资源忙。 应该是表对象的锁没有释放。

用如下SQL 查看一下系统中相关对象上锁的情况:

  1. /*Formattedon2011/9/2614:45:46(QP5v5.163.1008.3004)*/
  2. SELECTS.SIDSESSION_ID,
  3. S.USERNAME,
  4. DECODE(LMODE,
  5. 0,'None',
  6. 1,'Null',
  7. 2,'Row-S(SS)',
  8. 3,'Row-X(SX)',
  9. 4,'Share',
  10. 5,'S/Row-X(SSX)',
  11. 6,'Exclusive',
  12. TO_CHAR(LMODE))
  13. MODE_HELD,
  14. DECODE(REQUEST,
  15. 0,'None',
  16. 1,'Null',
  17. 2,'Row-S(SS)',
  18. 3,'Row-X(SX)',
  19. 4,'Share',
  20. 5,'S/Row-X(SSX)',
  21. 6,'Exclusive',
  22. TO_CHAR(REQUEST))
  23. MODE_REQUESTED,
  24. O.OWNER||'.'||O.OBJECT_NAME||'('||O.OBJECT_TYPE||')'asOBJECT_NAME,
  25. S.TYPELOCK_TYPE,
  26. L.ID1LOCK_ID1,
  27. L.ID2LOCK_ID2
  28. FROMV$LOCKL,SYS.DBA_OBJECTSO,V$SESSIONS
  29. WHEREL.SID=S.SIDANDL.ID1=O.OBJECT_ID


Oracle 查看 对象 持有锁的情况


该SQL 显示所有对象上的锁,如果要查某个具体的对象,可以根据OBJECT_NAME 字段进行一下过滤,找到对应的SID 之后去查V$SESSION 视图。

该视图会显示session 对应的信息,包括终端的信息,如果找到了终端,可以让它提交或者回滚一下就OK了。 我这里是测试环境,直接把session kill 掉了。然后修改表就ok了。

  1. SQL>altersystemkillsession'SID,SERIAL#'