昨天建索引碰到ORA-00054: resource busy and acquire with NOWAIT specified的問題,花費了很多時間解決。這個報錯其實很簡單,我碰到的這種情況就是使用者對這張表的事務沒有提交,導致不能對這種表進行DDL操作(建索引是有DDL操作的)。當然花費的時間主要是在一個坑上,值得注意的是資料庫是RAC的,當我kill掉事務還沒提交的session時,看不到堵塞了,但建索引還是報這個錯,原因是要多RAC的多個節點都要kill才行。下面我們來做個小實驗,只是單點的處理,RAC的處理只不過是要連不通的資料庫:
session1:(製造堵塞,事務不提交)
SQL> create table tt as select * from dba_objects;
表已建立。
SQL> update tt set object_id = object_id + 1;
已更新49838行。
session2:(建索引報錯)
SQL> create index ind_tt_object_id on tt(object_id);
create index ind_tt_object_id on tt(object_id) *
第 1 行出現錯誤:
ORA-00054: resource busy and acquire with NOWAIT specified
session3:(查出是哪個會話有問題,kill,如果是RAC則需要連多個資料庫kill)
SQL> select t2.username, t2.sid, t2.serial#, t2.logon_time
from v$locked_object t1, v$session t2
where t1.session_id = t2.sid
order by t2.logon_time;
USERNAME SID SERIAL# LOGON_TIME
------------------------------ ---------- ---------- --------------
TEST 149 20845 14-4月 -14
SQL> alter system kill session '149,20845';
系統已更改。
session2:(再建索引,就成功了)
SQL> create index ind_tt_object_id on tt(object_id);
索引已建立。