ORA-01502: 索引或这类索引的分区处于不可用状态

一、问题描述

插入数据时,出现如下报错:
ORA-01502: 索引或这类索引的分区处于不可用状态(英文:ora-01502:index ‘schema.index_name’ or partition of such index is in unusable state)。

二、原因分析

可能是对分区表做了操作,如drop部分分区。
查看出现问题的分区表,均有一个共同点:表上以“pk_”开头的索引为unusable状态,以“pk_”开头的索引是随创建主键约束而创建的。当用户在创建主键约束或唯一性约束的时候,会在相应的列上创建唯一性索引。所以可能是在删除分区的时候,导致分区表上的唯一性全局索引为不可用状态,导致新的数据无法正常插入,从而引发了该错误。

是不是索引不可用会导致DML操作失败呢?经过验证,发现以下特点:

1.对于非唯一性索引,如果索引不可用,是不会影响到到DML操作的;

2.对于唯一性索引,如果索引不可用,在进行DML操作时,会触发ORA-01502错误;

三、处理方法

1.检查索引状态,发现索引是“UNUSABLE”状态。

SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='INIT';

INDEX_NAME           INDEX_TYPE         TABLESPACE_NAME      TABLE_TYPE     STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
INIT                 NORMAL             INDX                 TABLE          UNUSABLE

2.设置在session级别跳过无效索引

SQL> alter session set skip_unusable_indexes=false;
 
Session altered

3.重建这个失效的索引

SQL> alter index init rebuild;

Index altered

拓展

分区索引的4种状态:

  • N/A:说明这个是分区索引需要查user_ind_partitions或者user_ind_subpartitions来确定每个分区是否可用;
  • VAILD:说明这个索引可用;
  • UNUSABLE:说明这个索引不可用;
  • USABLE :说明这个索引的分区是可用的。

查询当前索引的状态:select distinct status from user_indexes;

查询无效索引:select index_name from user_indexes where status <> ‘VALID’;

重建索引:alter index index_name rebuild (online);


参考链接:
https://www.cnblogs.com/AaronBear/p/9186103.html
https://www.cnblogs.com/shujuyr/p/15456940.html
https://blog.csdn.net/u011800041/article/details/86480407

你可能感兴趣的:(Oracle,数据库,数据库,oracle)