sql> create table t(a number);
table created.
現(xiàn)在,我們建立一個唯一索引來看看:
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.
將索引手工修改為unusable狀態(tài)(模擬發(fā)生索引失效的情況):
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
我們看到這是,已經(jīng)不能正常往表中插入數(shù)據(jù):
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
首先,我們通過重建索引(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>
現(xiàn)在我們再次模擬索引失效(unusable狀態(tài)):
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
然后,看看是否可以通過設(shè)置參數(shù)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>
很顯然,對于unique index,通過簡單的設(shè)置參數(shù)是不能解決問題的,要解決unique index 失效的問題,只能通過重建索引來實(shí)現(xiàn)。