共計 1668 個字符,預計需要花費 5 分鐘才能閱讀完成。
這篇文章主要介紹了數據庫中怎么清除創建失敗的索引,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。
在創建一張大表的索引時,因為沒有加并行而導致創建時間很長,這時候如果終止操作,比如直接關閉終端,然后再次登錄創建時就會報錯 ORA-00095 提示對象名字已被用,而去刪除對象時又報錯 ORA-08104 索引正在被創建。
SQL drop index xxx.BM_IX;
drop index xxx.BM_IX
*
ERROR at line 1:
ORA-08104: this index object 1443829 is being online built or rebuilt
SQL select object_id from dba_objects where object_name= BM_IX
OBJECT_ID
----------
1443829
$ oerr ora 08104
08104, 00000, this index object %s is being online built or rebuilt
// *Cause: the index is being created or rebuild or waited for recovering
// from the online (re)build
// *Action: wait the online index build or recovery to complete
從 oerr 工具看到的 ORA-08104 的解釋是索引并沒有創建失敗,而是在終端關閉之后,創建的操作還在繼續進行。創建或者重建索引時,系統會創建一個臨時日志表,這張表被用于存放創建或者重建索引期間產生的日志信息,同時在基表 IND$ 中這個索引的 FLAG 字段上會被設置為 BUILD 或者 REBUILD 標識,當索引信息變更時會把變更信息存入日志表。如果索引創建或者重建失敗,這個日志表和數據字典中的狀態位都需要后臺進程 smon 進行清理。
因此這里的索引不能被刪除是因為后臺進程 smon 還沒來得及清理相應的臨時段和標志位,認為 online rebuild 操作還在進行。
那么現在如何終止 rebuild index 這一操作?查找 metalink 得到一篇文檔:ORA-600 [12813] When Dropping A Table Partition After a Failed IndexRebuild (文檔 ID 803008.1)。它給出了兩種方法:
1)使用包 dbms_repair 包來清理
如果在出現問題的對象的數據庫活動能停下來,則直接簡單地執行如下語句即可:
connect / as sysdba
select dbms_repair.online_index_clean(problem index object_id) from dual;
exit
2)使用 PL/SQL block 調用 dbms_repair 包來清理
如果在出現問題的對象的數據庫活動不能停下來,則如下的 PL/SQL block 來處理
注:加上 dbms_repair.lock_wait 表示不是立刻清理,需要不斷的尋找資源鎖,直到搶到為止
declare
isClean boolean;
begin
isClean := FALSE;
while isClean=FALSE loop
isClean := dbms_repair.online_index_clean(dbms_repair.all_index_id,
dbms_repair.lock_wait);
dbms_lock.sleep(2);
end loop;
exception
when others then
RAISE;
/
感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“數據庫中怎么清除創建失敗的索引”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,更多相關知識等著你來學習!