iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >oracle中出现ORA-01502错误怎么办
  • 521
分享到

oracle中出现ORA-01502错误怎么办

2024-04-02 19:04:59 521人浏览 泡泡鱼
摘要

小编给大家分享一下oracle中出现ORA-01502错误怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!第一部分: 接到开

小编给大家分享一下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错误怎么办”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: oracle中出现ORA-01502错误怎么办

本文链接: https://www.lsjlt.com/news/64498.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • oracle中出现ORA-01502错误怎么办
    小编给大家分享一下oracle中出现ORA-01502错误怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!第一部分: 接到开...
    99+
    2022-10-18
  • oracle中出现ORA-12850错误怎么办
    这篇文章给大家分享的是有关oracle中出现ORA-12850错误怎么办的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 1.问题现象报错信息如下: Thu Aug 24 1...
    99+
    2022-10-19
  • oracle中出现ORA-00845错误怎么办
    这篇文章主要介绍了oracle中出现ORA-00845错误怎么办,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 问题描述:调大数据库内存后...
    99+
    2022-10-19
  • oracle中出现ORA-12520错误怎么办
    这篇文章主要介绍了oracle中出现ORA-12520错误怎么办,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 ...
    99+
    2022-10-19
  • oracle中出现ORA-65085错误怎么办
    这篇文章主要介绍了oracle中出现ORA-65085错误怎么办,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。SQL> show co...
    99+
    2022-10-19
  • oracle中出现ORA-27101错误怎么办
    这篇文章主要为大家展示了“oracle中出现ORA-27101错误怎么办”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“oracle中出现ORA-27101错误怎...
    99+
    2022-10-19
  • oracle中出现ORA-15201错误怎么办
    这篇文章主要介绍oracle中出现ORA-15201错误怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!系统环境:操作系统:    AIX5300-08Ora...
    99+
    2022-10-19
  • oracle中出现ORA-01122错误怎么办
    小编给大家分享一下oracle中出现ORA-01122错误怎么办,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!现象:在做表空间恢复演练时,遇到如下错误提示:SQL> alter da...
    99+
    2022-10-19
  • oracle中出现ORA-600错误怎么办
    这篇文章主要为大家展示了“oracle中出现ORA-600错误怎么办”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“oracle中出现ORA-600错误怎么办”这...
    99+
    2022-10-19
  • oracle中出现ORA-28000错误怎么办
    这篇文章给大家分享的是有关oracle中出现ORA-28000错误怎么办的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。    这个毛病特别...
    99+
    2022-10-19
  • oracle中出现ora-01013错误怎么办
    小编给大家分享一下oracle中出现ora-01013错误怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在测试的过程中发现...
    99+
    2022-10-19
  • ORACLE中出现ORA-28365错误怎么办
    这篇文章主要为大家展示了“ORACLE中出现ORA-28365错误怎么办”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ORACLE中出现ORA-28365错误怎...
    99+
    2022-10-19
  • oracle中出现ORA-01102错误怎么办
    这篇文章主要介绍了oracle中出现ORA-01102错误怎么办,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。测试环境中oracle数据库这...
    99+
    2022-10-19
  • oracle中出现ORA-09817错误怎么办
    这篇文章主要为大家展示了“oracle中出现ORA-09817错误怎么办”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“oracle中出现ORA-09817错误怎...
    99+
    2022-10-18
  • oracle中出现ORA-04031错误怎么办
    这篇文章将为大家详细讲解有关oracle中出现ORA-04031错误怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。此问题是sga过小而引起的,首先查看sga大小:s...
    99+
    2022-10-18
  • oracle中出现ORA-12005错误怎么办
    这篇文章给大家分享的是有关oracle中出现ORA-12005错误怎么办的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 Oracle Job ORA-12005 错误的解决 ...
    99+
    2022-10-18
  • oracle出现ORA-12705错误怎么办
    小编给大家分享一下oracle出现ORA-12705错误怎么办,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Oracle连接sqlplus时连接不上,报如下错误:ORA-12705: Ca...
    99+
    2022-10-19
  • Oracle中出现ORA-00600[KZSRGPW]错误怎么办
    这篇文章主要介绍了Oracle中出现ORA-00600[KZSRGPW]错误怎么办,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。环境:DB:...
    99+
    2022-10-19
  • oracle中出现ORA-00600内部错误怎么办
    这篇文章给大家分享的是有关oracle中出现ORA-00600内部错误怎么办的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。ORA-00600: 内部错误代码, 参数: [kcbn...
    99+
    2022-10-18
  • oracle中出现ORA-01078和LRM-00109错误怎么办
    小编给大家分享一下oracle中出现ORA-01078和LRM-00109错误怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作