程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> 解決ORA-00054:resourcebusyandacquirewithNOWAITspecified需要注意

解決ORA-00054:resourcebusyandacquirewithNOWAITspecified需要注意

編輯:Oracle教程

昨天建索引碰到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);
索引已創建。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved