數(shù)據(jù)庫中怎么清除創(chuàng)建失敗的索引

這篇文章主要介紹了數(shù)據(jù)庫中怎么清除創(chuàng)建失敗的索引,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

成都創(chuàng)新互聯(lián)公司主營府谷網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP開發(fā)公司,府谷h5微信小程序開發(fā)搭建,府谷網(wǎng)站營銷推廣歡迎府谷等地區(qū)企業(yè)咨詢

在創(chuàng)建一張大表的索引時,因為沒有加并行而導(dǎo)致創(chuàng)建時間很長,這時候如果終止操作,比如直接關(guān)閉終端,然后再次登錄創(chuàng)建時就會報錯ORA-00095提示對象名字已被用,而去刪除對象時又報錯ORA-08104索引正在被創(chuàng)建。

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的解釋是索引并沒有創(chuàng)建失敗,而是在終端關(guān)閉之后,創(chuàng)建的操作還在繼續(xù)進行。創(chuàng)建或者重建索引時,系統(tǒng)會創(chuàng)建一個臨時日志表,這張表被用于存放創(chuàng)建或者重建索引期間產(chǎn)生的日志信息,同時在基表IND$中這個索引的FLAG字段上會被設(shè)置為BUILD或者REBUILD標識,當索引信息變更時會把變更信息存入日志表。如果索引創(chuàng)建或者重建失敗,這個日志表和數(shù)據(jù)字典中的狀態(tài)位都需要后臺進程smon進行清理。

因此這里的索引不能被刪除是因為后臺進程smon還沒來得及清理相應(yīng)的臨時段和標志位,認為online rebuild操作還在進行。

那么現(xiàn)在如何終止rebuild index這一操作?查找metalink得到一篇文檔:ORA-600 [12813] When Dropping A Table Partition After a Failed IndexRebuild (文檔 ID 803008.1)。它給出了兩種方法:

1)使用包dbms_repair包來清理

如果在出現(xiàn)問題的對象的數(shù)據(jù)庫活動能停下來,則直接簡單地執(zhí)行如下語句即可:

connect / as sysdba
select dbms_repair.online_index_clean(<problem index object_id>) from dual; 
exit

2)使用PL/SQL block調(diào)用dbms_repair包來清理

如果在出現(xiàn)問題的對象的數(shù)據(jù)庫活動不能停下來,則如下的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; 
end;
/

感謝你能夠認真閱讀完這篇文章,希望小編分享的“數(shù)據(jù)庫中怎么清除創(chuàng)建失敗的索引”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

當前文章:數(shù)據(jù)庫中怎么清除創(chuàng)建失敗的索引
地址分享:http://muchs.cn/article40/johoho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、企業(yè)建站、網(wǎng)站收錄App開發(fā)、網(wǎng)站改版、App設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化