建立索引意外終止解決方法

531968912發表於2016-06-07
今天在重建索引的時候遭遇ORA-08104錯誤。
問題產生如下:
下班同事說有幾個索引是失效的。回到家中開啟電腦,發現有個全域性索引的幾個分割槽的索引狀態處於UNUSABLE中。 然後我講將處於失效狀態的分割槽摘出來,寫了一個簡單指令碼。
類似:
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P81 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P80 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P79 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P78 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P77 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P76 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P75 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P74 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P73 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P72 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P71 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P70 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P84 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P83 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P82 PARALLEL 4 ONLINE;
 
重建過程中發現很慢,每一個分割槽都是走的全表掃描。
因此想透過刪掉索引然後再建立索引的方式來加快索引的建立。
我採用ps -ef | grep LOCAL=YES 的方式找到本地登入的重建索引的程式ID。
然後想也沒想的就採用kill -9 pid 的方式結束了重建索引的程式。
 
然後杯具出現了
SQL> drop INDEX IDX_MKT_EXEC_01;   
drop INDEX  IDX_MKT_EXEC_01
                    *
ERROR at line 1:
ORA-08104: this index object 88214 is being online built or rebuilt
異常終止的線上重建索引導致SMON程式沒有將索引的重建標誌改回來,ORACLE認為索引還在ONLINE REBUILD中,禁止刪除索引。
如果不著急的話,可以等待SMON程式自己去清理。
如果著急的話可以採用如下的方法來清理重建索引的標誌位:
SQL> declare
  2    done boolean;
  3  begin
  4    done:=dbms_repair.online_index_clean(88214);
  5  end;
  6  /
PL/SQL procedure successfully completed.
 
Elapsed: 00:00:00.43
 
再次刪掉索引,成功。
 
SQL> drop INDEX  IDX_MKT_EXEC_01;
 
Index dropped.
 
 
 
在生產環境中,應該儘量避免KILL 作業系統的方式來直接結束程式,否則可能遇到不可避免的麻煩。



在sys使用者下執行下面的指令碼
DECLARE 
  RetVal BOOLEAN;
  OBJECT_ID BINARY_INTEGER;
  WAIT_FOR_LOCK BINARY_INTEGER;
BEGIN 
  OBJECT_ID := 67420;
--  我的資料庫中非法索引的id為67420.
  WAIT_FOR_LOCK := NULL;
  RetVal := SYS.DBMS_REPAIR.ONLINE_INDEX_CLEAN ();
  COMMIT; 
END; 



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2117050/,如需轉載,請註明出處,否則將追究法律責任。

相關文章