Oracle 查看對象持有鎖的情況
同事在測試庫上對一個表加欄位,提示 ORA-00054, 資源忙。 應該是表對象的鎖沒有釋放。
用如下SQL 查看一下系統中相關對象上鎖的情況:
- /* Formatted on 2011/9/26 14:45:46(QP5 v5.163.1008.3004) */
- SELECT S.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|| ' ) ' as OBJECT_NAME,
- S.TYPELOCK_TYPE,
- L.ID1LOCK_ID1,
- L.ID2LOCK_ID2
- FROMV$LOCK L, SYS.DBA_OBJECTSO,V$SESSION S
- WHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID
該SQL 顯示所有對象上的鎖,如果要查某個具體的對象,可以根據OBJECT_NAME 欄位進行一下過濾,找到對應的SID 之後去查V$SESSION 視圖。
該視圖會顯示session 對應的資訊,包括終端的資訊,如果找到了終端,可以讓它提交或者復原一下就OK了。 我這裡是測試環境,直接把session kill 掉了。然後修改表就ok了。
- SQL>alter system kill session 'SID,SERIAL#'