文档章节

"ora-01502 索引或这类索引的分区处于不可用状态"的解决方案

菠萝啊哈哈
 菠萝啊哈哈
发布于 2014/07/11 10:38
字数 521
阅读 5994
收藏 2

如题,在ORACLE中自动新增删除分区之后,会报出ora-01502的错误。

首先,问题的原因是在于进行表结构修改后,索引失效。问题解决有如下几个方式:

1、手动查询重建

(1)先查询失效索引,语句为:

      select index_name ,status  from user_indexes where Status = 'UNUSABLE' ;

(2)重建索引,语句为: 

  
alter index  xxx rebuild;

手动操作有个快捷的方式,可以将上面的步骤合成为一个查询语句:   

 select 'alter index ' || index_name || ' rebuild;' from user_indexes where Status = 'UNUSABLE' ;

这样直接复制查询出来的语句手动执行即可。

2、将上面的手动操作做成存储过程执行的“只能自动”

(1)创建重建索引的存储过程,语句如下:

create or replace procedure p_rebuild_all_index
   (tablespace_name in varchar2,--这里是表空间名,如果不改变表空间,可以传入null
   only_unusable in boolean)    --是否仅对无效的索引操作
as
   sqlt varchar(200);
begin
    --只取非临时索引
    for idx in (select index_name, tablespace_name, status from user_indexes where temporary = 'N') loop
        --如果是如重建无效的索引,且当索引不是无效时,则跳过
        if only_unusable = true and idx.status <> 'UNUSABLE' then
           goto continue;
        end if;

        if (tablespace_name is null) or idx.status = 'UNUSABLE' then
           --如果没有指定表空间,或索引无效,则在原表空间重建
           sqlt := 'alter index ' || idx.index_name || ' rebuild ';
        elsif upper(tablespace_name) <> idx.tablespace_name then
           --如果指定的不同的表空间,则在指定表空间待建索引
           sqlt := 'alter index ' || idx.index_name || ' rebuild tablespace ' || tablespace_name;
        else
           --如果表空间相同,则跳过
           goto continue;
        end if;

        dbms_output.put_line(idx.index_name);
        EXECUTE IMMEDIATE sqlt;
        <<continue>>
        null;
     end loop;
end;

(2) 创建执行重建的存储过程

CREATE OR REPLACE PROCEDURE EXEC_REBUILD_PROC AS
    v_err_num  NUMBER;  --ORA错误号
   v_err_msg  VARCHAR2(100); --错误描述
BEGIN
 --10代表创建10天的分区,tablespace代表表空间名
 p_rebuild_all_index(NULL,true);
 COMMIT;
EXCEPTION
 WHEN OTHERS THEN
  v_err_num := SQLCODE;
  v_err_msg := SUBSTR(SQLERRM, 1, 100);
  dbms_output.put_line('EXEC_REBUILD_PROC执行出现异常,错误码='|| v_err_num || '错误描述=' || v_err_msg);
END EXEC_REBUILD_PROC;

如此即可。以上方式均已测试可用。

© 著作权归作者所有

菠萝啊哈哈
粉丝 27
博文 131
码字总数 34592
作品 0
长沙
程序员
私信 提问
ORA-01502: 索引或这类索引的分区处于不可用状态

原因: 出现这个问题,可能有人move过表,或者disable 过索引。 1. alter table xxxxxx move tablespace xxxxxxx 命令后,索引就会失效。 2. alter index indexname unusable,命令使索引失效...

JackFace
2018/02/12
0
0
oracle11g分区中的两大陷阱

如何使用Oracle分区功能? 1.个别场景不能从根本上提高查询速度 在Oracle10g时不支持自动生成分区,技术人员都是手动创建一年或者半年的分区或者当超过限制时把数据都load到最大值分区,但是...

strict_nerd
05/17
0
0
导入导出 Oracle 分区表数据

-- -- 导入导出 Oracle 分区表数据 -- 导入导入Oracle 分区表数据是Oracle DBA 经常完成的任务之一。分区表的导入导出同样普通表的导入导出方式,只不过导入导出需要考 虑到分区的特殊性,如...

蔡培元
2016/08/23
18
0
ORA-14048: 分区维护操作不能与其它操作组合

今天 fannairu 同学导入数据库时出现一个错误, 提示如下: IMP-00017: 由于 ORACLE 错误 14048, 以下语句失败: "ALTER INDEX "SYS_C009967" UNUSABLE ENABLE" IMP-00003: 遇到 ORACLE 错误 14......

sailtseng
2012/06/07
0
0
oracle分区索引和全局索引总结

分区索引就是在所有每个区上单独创建索引,它能自动维护,在drop或truncate某个分区时不影响该索引的其他分区索引的使用,也就是索引不会失效,维护起来比较方便,但是在查询性能稍微有点影响...

zxf261
2012/06/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

https://zhuanlan.zhihu.com/p/61408911

在Logistimo,我们的所有应用程序都是Docker化的,并在Kubernetes内以docker容器运行。我们注意到在使用Java的容器上发生了大量重启,并且非常随机。Docker检查发现该pod被OOMKiller代码杀死...

xiaomin0322
17分钟前
0
0
北斗三号IGSO-2卫星发射成功!

6月25日,中国航天科技集团官方公众号宣布,北斗三号IGSO-2卫星发射成功! 航天科技集团表示,6月25日2点09分,我国在西昌卫星发射中心用长征三号乙运载火箭成功将北斗三号第2颗倾斜地球同步...

linux-tao
20分钟前
1
0
oracle通过dblink查询sqlserver报错

报错如下: SQL> select * from t@mstest; select * from t@test * ERROR at line 1: ORA-28545: error diagnosed by Net8 when connecting to an agent Unable to retrieve text of NETWORK......

突突突酱
23分钟前
0
0
docker-elasticsearch学习

如果不适用docker,面临的问题有: 部署非常慢 成本非常高 资源浪费 难于迁移和扩展 可能会被限定硬件厂商 虚拟化技术的优点: 虚拟化技术出现以后,一个物理机可以部署多个App,每个App独立...

Vincent-Duan
32分钟前
0
0
MySQL权限管理坑

权限系统的工作原理 MySQL权限系统通过下面两个阶段进行认证: (1)对连接的用户进行身份认证,合法的用户通过认证、不合法的用户拒绝连接。 (2)对通过认证的合法用户赋予相应的权限,用户...

bengozhong
34分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部