`

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

阅读更多

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

分享到:
评论

相关推荐

    ora-00604错误解决方法

    ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法ora-00604 错误 解决 方法

    Oracle 11gr2连Oracle 19c 报ORA-28040 ORA-01017解决方法.pdf

    这篇文章主要讲述了在Oracle 11g R2客户端尝试连接Oracle 19c服务端时,遇到了两个特定的错误:ORA-28040和ORA-01017,以及如何解决这些问题。 ORA-28040错误是因为客户端和数据库服务器在版本兼容性上存在不匹配。...

    Oracle数据库发生ORA-04031错误原因浅析及处理.pdf

    Oracle数据库发生ORA-04031错误原因浅析及处理 Oracle数据库是甲骨文公司提供的...本文通过对ORA-04031错误的分析和解决方法的介绍,旨在帮助读者更好地理解Oracle数据库中的ORA-04031错误,并提供了实用的解决方法。

    使用工具IMPDP导入数据时ORA-39002、ORA-39070错误排查

    在使用Oracle Data Pump工具IMPDP(Import Data Pump)进行数据导入的过程中,可能会遇到ORA-39002和ORA-39070等错误。本文将针对这些错误的排查方法进行详细介绍,帮助用户理解问题的原因及解决策略。 ### 错误...

    Oracle 10g启动后报ORA-16038错误的解决方法

    ### Oracle 10g启动后报ORA-16038错误的解决方法 #### 错误概述 在启动Oracle 10g数据库时遇到ORA-16038错误,该错误通常与归档日志操作有关。具体错误信息为: ``` ORA-16038: log 1 sequence #230 cannot be ...

    ERwin连接oracle报ORA-01041内部错误,hostdef扩展名不存在.docx

    ### ERwin连接Oracle报ORA-01041内部错误,hostdef扩展名不存在...通过上述详细的步骤和建议,可以有效地解决ERwin连接Oracle时报ORA-01041内部错误的问题。在实际操作中,还需要根据具体的环境和情况进行适当的调整。

    Drop goldengate用户时报ORA-00604 ORA-20782 ORA-06512问题解决

    ### 解决Drop Goldengate 用户时报ORA-00604 ORA-20782 ORA-06512问题 #### 一、问题背景与现象 在进行Oracle数据库管理过程中,经常会遇到需要删除用户的场景。当尝试执行`drop user goldengate cascade;`命令时,...

    ORACLE8I数据库应用EXP工具时ORA-06553报错的解决方法.pdf

    摘要:本文主要解决ORACLE 8I数据库应用EXP工具时ORA-06553报错的问题,分析出现问题的原因,并提供了正确的解决方法和措施。 知识点1:Oracle 8I数据库EXP工具的应用 Oracle 8I数据库EXP工具是Oracle数据库提供...

    ORACLE ORA-00132 ORA-00214

    ### Oracle 错误 ORA-00132 和 ORA-00214 解析及处理 #### 一、错误概述 在Oracle数据库管理过程中,遇到ORA-00132和ORA-00214这类错误时,往往意味着数据库配置或启动过程中出现了问题。下面将对这两个错误进行...

    创建物化视图ORA-12014错误解决方法

    ### 创建物化视图ORA-12014错误解决方法 #### 背景介绍 在Oracle数据库中,物化视图(Materialized View)是一种用于优化查询性能的重要工具。它预先计算并存储了复杂的查询结果,从而在实际查询时能够快速地返回...

    如何处理错误ORA-29275:部分多字节字符

    通过以上方法,我们可以有效地解决ORA-29275错误,并提高Oracle数据库的整体稳定性和数据完整性。需要注意的是,在实际操作过程中,应当根据具体情况选择最适合的解决方案。例如,在某些情况下,调整字段长度可能是...

    解决Exception java.sql.SQLException ORA-00600 内部错误代码

    在oracle里面运行一下,解决Exception java.sql.SQLException ORA-00600 内部错误代码

    数据库ORA-01460错误的解决方法

    本文将深入探讨ORA-01460错误的成因、影响以及提供一系列有效的解决方案,帮助数据库管理员和开发人员克服这一挑战。 ### ORA-01460错误概述 ORA-01460错误全称为“ORA-01460: unimplemented unreasonable ...

    ora-28056解决方法

    但是,清除事件日志是最简单和有效的解决方法,能够快速解决ora-28056错误。 ora-28056错误的预防方法: 为了预防ora-28056错误,数据库管理员可以定期清除事件日志,确保事件日志不溢出。此外,数据库管理员也...

    关于创建oracle 连接时报以下错误,ORA-01017 ORA-02063

    在创建Oracle数据库连接时遇到的错误ORA-01017和ORA-02063涉及到用户认证问题以及Oracle数据库版本之间的差异处理。ORA-01017错误表示用户名或密码无效,登录被拒绝,而ORA-02063则通常表示在Oracle数据库之间进行...

    Oracle_ORA-12518故障_处理

    本文旨在详细介绍ORA-12518错误的成因、常见表现形式以及具体的故障排查方法,以帮助读者在实际工作中能够更高效地解决这一问题。 #### 目的 本文旨在探讨如何接近并解决ORA-12518/TNS-12518错误,并提供详细的...

    ORA-12560 TNS 协议适配器错误

    在Oracle数据库管理过程中,经常会遇到各种各样的错误提示,其中“ORA-12560 TNS: 协议适配器错误”是较为常见的一种。这种错误通常发生在客户端尝试连接到Oracle服务器时,表明网络通信出现了问题。本文将详细介绍...

    离线误删空间文件导致的ORA-01033及ORA-01145问题的解决办法

    解决ORA-01145错误的方法如下: 1. **启用介质恢复**:对于需要进行离线操作的数据文件,首先应启用介质恢复。 2. **创建新的数据文件**:可以先创建一个新的数据文件来替换原有的数据文件,然后再执行离线操作。 3....

    ora-01460 错误原因分析

    ### ORA-01460 错误原因分析 ...通过以上步骤的检查和调整,通常可以解决大部分由ORA-01460错误引起的数据库操作问题。需要注意的是,在进行任何更改之前,最好先备份相关配置和数据,以免出现意外情况。

Global site tag (gtag.js) - Google Analytics