ORA-01502 state unusable错误成因和解决方法(一)

错误|解决

接到开发人员和业务人员的通知,说一个登陆页面不能用了,报错:

2005-01-31 13: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>
看来,重建索引才是解决这类问题的彻底的方法。

 

 

 

 

时间: 2024-11-03 05:17:00

ORA-01502 state unusable错误成因和解决方法(一)的相关文章

使用u盘时弹出错误提示0x80070570解决方法

  使用u盘时弹出错误提示0x80070570解决方法来啦~相信很多朋友在使用U盘都遇到了错误提示0x80070570,遇到这情况该怎么解决呢?下文小编就为大家带来使用u盘时弹出错误提示0x80070570的解决方法,一起去了解下吧. 使用u盘时弹出错误提示0x80070570解决方法: 1.先检查u盘是否能够正常被电脑识别到,如果可以识别到那么再确认u盘中的文件数据是否重要,如果不重要,那么重新格式化u盘即可解决问题; 2.如果u盘中有重要文件时那么再尝试使用下面的操作解决问题: ①.将鼠标移

Win8系统安装iTunes出现错误2503的解决方法

  Win8系统安装iTunes出现错误2503的解决方法 解决方法 1.查看本机电脑数位,计算机---右键---属性---看是32的还是64的; 2.官网下载数位对应的iTunes; 3.卸载原有程序,包括所有apple开头的程序,以及itunes,还有bonjour程序,不然安不上;安装iTunes,最好C盘,不要更改自然出现的路径'可以在安全模式下安装;最好管理员授权安装;

win7电脑开机后显示CPU Fan Error错误提示的解决方法

win7电脑开机后显示CPU Fan Error错误提示的解决方法 方法一: 如果出现CPU风扇接线接错的情况会导致出现CPU Fan Error提示,打开机箱检查CPU风扇是否连接到主板对应的接口即可. 方法二: 开机后就按下DEL键进入BIOS,进入POWER的Hardware Monitor,将CPU FAN SPEED项改成IGNORED,CHASSIS FANSPEED项改成N/A,POWER FAN SPEED项改成IGNORED,然后看是否还会出现错误提示. 方法三: 或者是由于一

win8系统安装Office时提示”错误1911“的解决方法

win8系统安装Office时提示"错误1911"的解决方法 1.看到安装的过程中,一个名为INKDIV.dll的动态库文件无法正常完成注册.说明之前Office程序的参与还在,需要清理一下; 2.这个问题比较普遍,这是Office程序特有的故障,而且微软也有专用工具用以处理这样的问题.这个专用工具,是一个全英文的程序,但是操作还是比较简单的.首先下载工具.解压.百度云网盘分享路径是:全部文件 > 维护电脑 > 清理卸载 > [微软专用卸载工具]地址:http://p

Win8系统笔记本创建WiFi时提示错误1061的解决方法

Win8系统笔记本创建WiFi时提示错误1061的解决方法   解决方法如下: 1.检查笔记本电源是否连上,接上电源看是否能启用wifi共享服务. 2.设备管理-网络适配器 里面将驱动程序升级到最新(如果装的是win8驱动一般是最新的),再尝试启用共享. 3.如果前两步还没有解决,仍然提示错误1061,你就试试最麻烦的一步:准备杀毒吧. windows7教程 windows8教程 windows10教程

宽带连接错误769的解决方法

宽带连接错误769的解决方法: 方法一:有本地连接,但是被禁止首先点击电脑桌面右下角的网络. 在网络列表中打开网络共享中心 在网络共享中心打开更改适配器设置. 找到本地连接 右键单击本地连接,选择连接. 等待连接完毕,这样我们就完成了设置. 方法二:没有本地连接怎么办如果你的电脑的网络中心没有本地连接,那么你需要调出本地连接.首先点击开始--控制面板. 在控制面板中找到系统和安全 在系统和安全里找到管理工具 在管理工具中找到服务,并打开之 在服务中,找到network connection,右键

win7系统宽带连接错误734的解决方法

win7系统宽带连接错误734的解决方法   解决方法: 一.右键网上邻居,选择属性,将里面的宽带连接删除掉,重新建立宽带连接. 二.检查你的网络是否开通了绿色上网,如果有的话马上关掉. 三.可在网络连接--属性--安全--验证我的身份中,选择"没有安全措施的密码",也许能解决问题. 四.更新电脑网卡的驱动程序. 五.致电ISP询问,删除所有网络组件重新安装网络. 六.可卸载原拔号程序,重新下载安装互联星空或新建宽带连接.在关机时先关掉宽带连接. 七.可在本地连接里面把micosoft

Win8.1系统Windows Defender服务出现0x80070422错误无法启动解决方法

  在Windows中也是有内置的清理间谍软件的应用噢,那就是Windows Defender了,在电脑裸奔的情况下,使用Windows Defender也是不错的选择,但是有小伙伴遇到了Win8.1下Windows Defender的服务无法启动错误0x80070422的问题,在这里小编也寻找到了答案,赶紧来和你们分享一下. Win8.1 的Windows Defender 解决方法如下: 1.右键点击"开始菜单",然后选择其中的"命令行提示符(管理员)",然后输

Win8开机提示“你的电脑出现问题需要重启,我们只需要收集这些错误信息”的解决方法

  解决方法: 1.鼠标移动到左下角,然后点击右键,选择"命令提示符(管理员),然后输入以下命令:C:windowssystem32>netsh回车; 2.然后输入winhttp回车; 3.最后输入 import proxy source=ie 回车,出现提示:直接访问<没有代理服务器>; 4.先在BIOS中设置硬盘IDE模式,不行再设置成AHCI模式,再安装相应的驱动; 5.各驱动(如显卡驱动)需安装官方认证版的驱动; 6.使用Windows 8修复光盘通过Win8自带的系统