?
1說明
數據庫錯誤ORA-29861:域索引標記為LOADING/FAILED/UNUSABLE,其錯誤原因及解決辦法,根據ORACLE官方文檔的說法如下:
//?*Cause:?An?attempt?has?been?made?to?access?a?domain?index?that?is
//?????????being?built?or?is?marked?failed?by?an?unsuccessful?DDL
//?????????or?is?marked?unusable?by?a?DDL?operation.
//?*Action:?Wait?if?the?specified?index?is?marked?LOADING
//??????????Drop?the?specified?index?if?it?is?marked?FAILED
//??????????Drop?or?rebuild?the?specified?index?if?it?is?marked?UNUSABLE
由上述可知,當空間索引被DDL標記為FAILED或UNUSABLE時,訪問空間索引會報該錯誤。當出現此類錯誤時,若標記為LOADING,則需等待DDL完成;若標記為FAILED,則需刪除索引;若標記為USUSABLE,則需重建或刪除。盡管,ORACLE給出了解決辦法,但顯然不適用于我們的使用場景。我們不可能在每一次出現此類錯誤時,都刪除索引重建或者使用REBUILD命令。我們的目標是避免此類錯誤的產生,而不是在此類錯誤發生后采取某些解決手段。
既然是由DDL引起,自然首先應關心哪些DDL會引起此類錯誤呢?這里分兩類情況,分全局索引和分區索引。
2全局索引
????當使用全局域索引時,以下的DDL命令會造成上述域索引錯誤:
- Exchange partition(我們的應用中目前沒有使用這一技術)
- Drop partiion ,當drop的分區中存在數據記錄時,標記UNUSABLE
- Truncate partition(我們的應用中目前沒有使用這一技術)
- Split partition ,當分裂后的兩個分區中均存在數據時,標記UNUSABLE
- Create index ,當由于某些原因(例如弧),創建失敗時,標記FAILED
在我們的應用中,存在drop partition、split partition、create index命令。其中create index在數據庫初始化的時候進行,此時圖層為空圖層,所以不會出現將域索引標記為FAILED的情況;而drop partition會在刪除某個縣的數據時用到,此時該分區內可能有數據,當存在數據時,會導致域索引被標記為USUABLE;split partition會在應用中用到,但不會出現分裂后的兩個分區均存在數據的情況,因此在我們的應用中不會因為split partition導致域索引被標記為UNUSABLE或FAILED。因此,得出一個結論,在使用drop partition、技術刪除某個縣的數據時,若使用全局索引,極有可能出現域索引的問題。
可以通過如下命令查看某個全局索引是否被標記為UNUSABLE或FAILED。
select INDEX_NAME,INDEX_TYPE,STATUS,DOMIDX_STATUS,DOMIDX_OPSTATUS from user_indexes where table_name=TABLENAME and index_type='DOMAIN';
若STATUS值為UNUSABLE或FAILED,或者DOMIDX_OPSTATUS值為FAILED,則該索引需要被刪除或被重建。重建的命令如下:
Alter index index_name rebuild;
3分區索引
????當使用分區索引時,以下DDL命令會造成上述域索引錯誤:
- ????Split partition ,當分裂后的兩個分區中均存在數據時,標記UNUSABLE
- Create index ,當由于某些原因(例如弧),創建失敗時,標記FAILED
其中create index在數據庫初始化的時候進行,此時圖層為空圖層,所以不會出現將域索引標記為FAILED的情況;split partition會在應用中用到,但不會出現分裂后的兩個分區均存在數據的情況,因此在我們的應用中不會因為split partition導致域索引被標記為UNUSABLE或FAILED。綜上所述,對于分區索引,我們的應用應該不會導致域索引錯誤。當的確在分區索引時出現了域索引錯誤,極有可能將多個縣的數據入在了一個分區中。而至于為什么出現將多個縣的數據入在了一個分區中,需要認真分析原因。
可以通過如下命令查看某個全局索引是否被標記為UNUSABLE或FAILED。
Select INDEX_NAME,PARTITION_NAME,STATUS,DOMIDX_OPSTATUS from user_ind_partitions where index_name=INDEXNAME
若STATUS值為UNUSABLE或FAILED,或者DOMIDX_OPSTATUS值為FAILED,則該索引需要被刪除或被重建。重建的命令如下:
Alter index INDEXNAME rebuild partition partition_name;