久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

oracle中出現ORA

146次閱讀
沒有評論

共計 7551 個字符,預計需要花費 19 分鐘才能閱讀完成。

丸趣 TV 小編給大家分享一下 oracle 中出現 ORA-01502 錯誤怎么辦,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

第一部分:

接到開發人員和業務人員的通知,說一個登陸頁面不能用了,報錯:

2017-10-24 15:59:02,721 [com.aspire.common.dao.OamUserDAO]- -214:select 錯誤
java.sql.SQLException: ORA-01502 state
這個錯誤是由于索引失效造成的,重建索引后,問題就解決了。
為了搞清楚索引為什么會失效,以及如何解決,我們做個測試:
首先我們創建一個普通的測試表(非分區表):
SQL create table t(a number);
Table created.
SQL select tablespace_name from user_segments where segment_name= T
TABLESPACE_NAME
——————————
DATA_DYNAMIC
SQL
然后,我們創建一個普通索引
SQL create index idxt on t(a);
Index created.
SQL insert into t values(10);
1 row created.
SQL set linesize 200
SQL select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name= IDXT
INDEX_NAME                     INDEX_TYPE                  TABLESPACE_NAME                TABLE_TYPE  STATUS
—————————— ————————— —————————— ———– ——–
IDXT                           NORMAL                      DATA_DYNAMIC                   TABLE       VALID
SQL
模擬索引是失效的情況:
SQL alter table  t move tablespace tools
  2  /
Table altered.
SQL select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name= IDXT
INDEX_NAME                     INDEX_TYPE                  TABLESPACE_NAME                TABLE_TYPE  STATUS
—————————— ————————— —————————— ———– ——–
IDXT                           NORMAL                      DATA_DYNAMIC                   TABLE       UNUSABLE
SQL  
我們看到,當使用類似 alter table xxxxxx move tablespace xxxxxxx 命令后,索引就會失效。
當然,作為測試,也可以直接使用 alter index idxt unusable; 命令使索引失效,例如:
SQL alter index idxt unusable;
Index altered.
SQL
在這種情況下,我們向表中插入數據看看是什么情況:
SQL insert into t values(11);
insert into t values(11)
*
ERROR at line 1:
ORA-01502: index MISC.IDXT or partition of such index is in unusable state

SQL  
我們看到,這時就出現了常見的“ORA-01502: index XXXXXXXX or partition of such index is in unusable state”錯誤。
檢查一下索引狀態,我們會注意到索引已經是“UNUSABLE”了。
SQL select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name= IDXT
INDEX_NAME                     INDEX_TYPE                  TABLESPACE_NAME                TABLE_TYPE  STATUS
—————————— ————————— —————————— ———– ——–
IDXT                           NORMAL                      DATA_DYNAMIC                   TABLE       UNUSABLE
SQL
對于普通表中的不同索引(非唯一索引),我們有兩種方法解決這個問題。
方法一:設置 skip_unusable_indexes=true;
SQL alter session set skip_unusable_indexes=true;
Session altered.
SQL insert into t values(11);
1 row created.
SQL commit;
Commit complete.
SQL select * from t;
         A
———-
         1
         2
         3
         4
         5
        10
        11
7 rows selected.
SQL select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name= IDXT
INDEX_NAME                     INDEX_TYPE                  TABLESPACE_NAME                TABLE_TYPE  STATUS
—————————— ————————— —————————— ———– ——–
IDXT                           NORMAL                      DATA_DYNAMIC                   TABLE       UNUSABLE
SQL
現在我們看到,這個索引的狀態雖然還是“UNUSABLE”但是,通過設置“alter session set skip_unusable_indexes=true;”,
我們已經可以訪問這個表了,但是請注意,這種情況下,這個索引是不可用的,也就是說優化器在考慮是否要使用索引時是不考慮這個所以的。
方法 2:通過常見所以徹底解決這個問題
首先,先設置“skip_unusable_indexes=false”,也就是不跳過失效索引
SQL alter session set skip_unusable_indexes=false;
Session altered.
SQL
然后重建這個失效的索引
SQL alter index idxt rebuild;
Index altered.
SQL select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name= IDXT
INDEX_NAME                     INDEX_TYPE                  TABLESPACE_NAME                TABLE_TYPE  STATUS
—————————— ————————— —————————— ———– ——–
IDXT                           NORMAL                      DATA_DYNAMIC                   TABLE       VALID
SQL  
我們看到重建索引后,索引的狀態就正常了。
現在插入數據,看看是正常:
SQL insert into t values(12);
1 row created.
SQL commit;
Commit complete.
SQL  
看來,重建索引才是解決這類問題的徹底的方法。

第二部分:

SQL create table t(a number);
Table created.
現在,我們建立一個唯一索引來看看:
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 狀態(模擬發生索引失效的情況):
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
首先,我們通過重建索引(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
現在我們再次模擬索引失效 (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
然后,看看是否可以通過設置參數 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,通過簡單的設置參數是不能解決問題的,要解決 unique index 失效的問題,只能通過重建索引來實現。

————————————————————————————

【總結】

1、移動 table 的表空間后,基于該 table 的索引會自動失效 UNUSABLE;此時訪問或操作該 table 時,會報 ORA-01502 異常;

2、對于普通索引,可以通過跳過索引或重建索引來解決 ORA-01502 異常的問題;

3、對于唯一索引,則只能通過重建索引來解決 ORA-01502 異常的問題。

【參考】

—   創建普通索引

SQL alter index idxt unusable; 

— 設置 skip_unusable_indexes=true;

SQL alter session set skip_unusable_indexes=true; 

– 重建索引

SQL alter index idxt rebuild;

– 創建唯一索引
SQL create unique index idx_t on t(a);

查詢索引狀態:

SQL select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name= IDXT

以上是“oracle 中出現 ORA-01502 錯誤怎么辦”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-24發表,共計7551字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 克什克腾旗| 囊谦县| 澳门| 新平| 额敏县| 江阴市| 大新县| 石台县| 清镇市| 昆山市| 玉龙| 柘荣县| 庆安县| 应用必备| 灵台县| 阿拉善盟| 阿克陶县| 嘉峪关市| 祁连县| 鄄城县| 积石山| 泌阳县| 扎赉特旗| 赤峰市| 嵩明县| 分宜县| 体育| 新乡县| 伊吾县| 偏关县| 和龙市| 筠连县| 白玉县| 普兰县| 磴口县| 嘉峪关市| 腾冲县| 扬州市| 博客| 渝北区| 全南县|