Oracle索引錯誤的解決辦法

 index VHL_V6.PK_WEB_APP_TGT_OBJ or partition of such index is in unusable state 

轉載:http://blog.csdn.net/cnham/article/details/4603829

今天在選擇一條記錄進行做刪除操作時,碰見index失敗的問題,如下:
處理失敗!錯誤信息:[SQLException  ORA-01502  index  VHL_V6.PK_WEB_APP_TGT_OBJ  or partition of such index is in unusable state ]
在網上查詢了下,知道原因,就上數據庫查了一下,結果如下:
1 PK_WEB_APP_TGT_OBJ NORMAL VHL_V6 TABLE UNUSABLE。
顯然是UNUSABLE狀態,那也就知道原因了,呵呵,解決!

以下爲參考文件:

SQL> create table t(a number);
Table created.

1、現在,我們建立一個唯一索引來看看:
SQL> create unique index idx_t on t(a);
Index created.
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='T';          
no rows selected
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
INDEX_NAME                     INDEX_TYPE                  TABLESPACE_NAME                TABLE_TYPE  STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T                          NORMAL                      DATA_DYNAMIC                   TABLE       VALID
SQL> insert into t values(1);
1 row created.
SQL> commit;
Commit complete.

2、將索引手工修改爲unusable狀態(模擬發生索引失效的情況):
SQL> alter index idx_t unusable;
Index altered.
SQL>  select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
INDEX_NAME                     INDEX_TYPE                  TABLESPACE_NAME                TABLE_TYPE  STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T                          NORMAL                      DATA_DYNAMIC                   TABLE       UNUSABLE
我們看到這是,已經不能正常往表中插入數據:
SQL> insert into t values(2);
insert into t values(2)
*
ERROR at line 1:
ORA-01502: index 'MISC.IDX_T' or partition of such index is in unusable state

3、首先,我們通過重建索引(rebuild index)的方法來解決問題:
SQL> alter index idx_t rebuild;
Index altered.
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
INDEX_NAME                     INDEX_TYPE                  TABLESPACE_NAME                TABLE_TYPE  STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T                          NORMAL                      DATA_DYNAMIC                   TABLE       VALID
SQL> insert into t values(2);
1 row created.
SQL> commit;
Commit complete.
SQL>

4、現在我們再次模擬索引失效(unusable狀態):
SQL> alter index idx_t unusable;
Index altered.
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
INDEX_NAME                     INDEX_TYPE                  TABLESPACE_NAME                TABLE_TYPE  STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T                          NORMAL                      DATA_DYNAMIC                   TABLE       UNUSABLE
SQL> insert into t values(3);
insert into t values(3)
*
ERROR at line 1:
ORA-01502: index 'MISC.IDX_T' or partition of such index is in unusable state

5、然後,看看是否可以通過設置參數skip_unusable_indexes=true來解決問題:
SQL> alter session set skip_unusable_indexes=true;
Session altered.
SQL> insert into t values(3);
insert into t values(3)
*
ERROR at line 1:
ORA-01502: index 'MISC.IDX_T' or partition of such index is in unusable state
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
INDEX_NAME                     INDEX_TYPE                  TABLESPACE_NAME                TABLE_TYPE  STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T                          NORMAL                      DATA_DYNAMIC                   TABLE       UNUSABLE
SQL> alter index idx_t rebuild;
Index altered.
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_T';
INDEX_NAME                     INDEX_TYPE                  TABLESPACE_NAME                TABLE_TYPE  STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_T                          NORMAL                      DATA_DYNAMIC                   TABLE       VALID
SQL> insert into t values(3);
1 row created.
SQL> commit;
Commit complete.
SQL>

 

刪除主鍵索引    --索引的disable和enable狀態還是不太懂

先使索引失效 DISABLE

alter table TEST_TABLE   add constraint TEST_TABLE primary key (TEST_ID)  disable;

刪除主鍵索引

drop index test_id;

曾經無意中跑了一個建表腳本,建了兩百多張表,爲趕時間倉促間只是簡單的DROP表,結果導致user_object中INDEX的記錄出現很多亂碼,一定要刪除索引先,是以爲戒


總結:對於unique index,通過簡單的設置參數是不能解決問題的,要解決unique index 失效的問題,只能通過重建索引來實現。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章