接到開發人員和業務人員的通知
java
這個錯誤是由於索引失效造成的
為了搞清楚索引為什麼會失效
首先我們創建一個普通的測試表(非分區表)
SQL> create table t(a number);
Table created
SQL> select tablespace_name from user_segments where segment_name=
TABLESPACE_NAME
DATA_DYNAMIC
SQL>
然後
SQL> create index idxt on t(a);
Index created
SQL> insert into t values(
SQL> set linesize
SQL> select index_name
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
IDXT NORMAL DATA_DYNAMIC TABLE VALID
SQL>
模擬索引是失效的情況
SQL> alter table t move tablespace tools
Table altered
SQL> select index_name
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
IDXT NORMAL DATA_DYNAMIC TABLE UNUSABLE
SQL>
我們看到
當然
SQL> alter index idxt unusable;
Index altered
SQL>
在這種情況下
SQL> insert into t values(
insert into t values(
*
ERROR at line
ORA
SQL>
我們看到
檢查一下索引狀態
SQL> select index_name
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
IDXT NORMAL DATA_DYNAMIC TABLE UNUSABLE
SQL>
對於普通表中的不同索引(非唯一索引)
方法一
SQL> alter session set skip_unusable_indexes=true;
Session altered
SQL> insert into t values(
SQL> commit;
Commit complete
SQL> select * from t;
A
SQL> select index_name
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
IDXT NORMAL DATA_DYNAMIC TABLE UNUSABLE
SQL>
現在我們看到
我們已經可以訪問這個表了
方法
首先
SQL> alter session set skip_unusable_indexes=false;
Session altered
SQL>
然後重建這個失效的索引
SQL> alter index idxt rebuild;
Index altered
SQL> select index_name
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
IDXT NORMAL DATA_DYNAMIC TABLE VALID
SQL>
我們看到重建索引後
現在插入數據
SQL> insert into t values(
SQL> commit;
Commit complete
SQL>
看來
From:http://tw.wingwit.com/Article/program/Oracle/201311/16930.html