zoukankan      html  css  js  c++  java
  • Oracle异常处理——ORA-01502:索引或这类索引的分区处于不可用状态

    Oracle异常处理——ORA-01502:索引或这类索引的分区处于不可用状态
    参考自:https://www.cnblogs.com/lijiaman/p/9277149.html

    1、原因分析
    经过查证,发现是在删除分区的时候,导致分区表上的唯一性全局索引为不可用状态,导致新的数据无法正常插入,从而引发了该错误。
    是不是索引不可用会导致DML操作失败呢?经过验证,发现以下特点:
    (1)对于非唯一性索引,如果索引不可用,是不会影响到到DML操作的;
    (2)对于唯一性索引,如果索引不可用,在进行DML操作时,会触发ORA-01502错误;
    哪些操作会导致索引失效:
    (1)move操作
    alter table tableName move [tablespace tablespaceName];
    (2)用户手动unseable索引
    alter index schema.indexName unusable;
    (3)分区表的删除分区操作
    alter table tableName drop partition partitionName;
    2、解决方法
    创建唯一索引的三种方式:
    (1)直接创建唯一性索引
    语法为:CREATE UNIQUE INDEX index_name on table_name(col1,col2,…);
    (2)创建主键约束时自动创建唯一性索引
    语法为:ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY(col1,col2,..);
    (3)创建唯一性约束时自动创建唯一性索引
    语法为:ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE(col1,col2,…);
    解决方法:
    (1)方案一:删除唯一性索引
    与业务方面沟通,确认唯一性索引是否可以删除,如果可以,直接删除索引,删除语法为:
    DROP INDEX schema.index_name;
    对于由主键约束或唯一性约束创建的唯一性索引,不能直接删除,正确的方法是删除相应的约束。
    ALTER TABLE tableName DROP CONSTRAINT constraint_name;
    小结:该方法简单粗暴,前提是在约束或索引在业务方面可以删除的情况下才能使用。
    (2)方案二:重建唯一性索引(针对非分区表)
    语法为:ALTER INDEX [schema.]index_name REBUILD [ONLINE] [TABLESPACE tablespace name]
    小结:该方法可以使索引可用。但对于分区表而言,依然存在问题:在下一次删除分区后,索引状态又会变为不可用。
    (3)方案三:删除不可用的索引,创建唯一性分区索引(针对分区表)
    对于主键约束、唯一性约束,可以使用以下语法添加唯一性局部分区索引:
    ALTER TABLE [schema.]table_name ADD CONSTRAINT constarint [PRIMARY KEY | UNIQUE](col1,col2)
    USING INDEX LOCAL TABLESPACE tablespace_name;
    小结:该方法可以有效解决分区表因删除分区导致的索引不可用问题。

  • 相关阅读:
    Ajax在表单中的应用
    jQuery实例
    Ajax之404,200等查询
    Ajax知识总结
    Ajax之eval()函数
    闭包应用
    全局预处理与执行,作用域与作用域链
    替换富文本里的px为rem
    vue2 兼容ie8
    vue-awesome-swiper 水平滚动异常
  • 原文地址:https://www.cnblogs.com/shujk/p/12783836.html
Copyright © 2011-2022 走看看