同事在測試庫上對一個表加欄位,提示 ORA-00054, 資源忙。 應該是表對象的鎖沒有釋放。
用如下SQL 查看一下系統中相關對象上鎖的情況:
<pre name="code" class="sql">/* 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';</pre><p>
該SQL 顯示所有對象上的鎖,如果要查某個具體的對象,可以根據OBJECT_NAME 欄位進行一下過濾,找到對應的SID 之後去查V$SESSION 視圖。
該視圖會顯示session 對應的資訊,包括終端的資訊,如果找到了終端,可以讓它提交或者復原一下就OK了。 我這裡是測試環境,直接把session kill 掉了。然後修改表就ok了。
SQL>alter system kill session 'SID,SERIAL#'
-------------------------------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
Weibo: http://weibo.com/tianlesoftware
Email: dvd.dba@gmail.com
DBA1 群:62697716(滿); DBA2 群:62697977(滿) DBA3 群:62697850(滿)
DBA 超級群:63306533(滿); DBA4 群:83829929(滿) DBA5群: 142216823(滿)
DBA6 群:158654907(滿) DBA7 群:69087192(滿) DBA8 群:172855474
DBA 超級群2:151508914 DBA9群:102954821 聊天 群:40132017(滿)
--加群需要在備忘說明Oracle資料表空間和資料檔案的關係,否則拒絕申請