分析和解决 ORA-01502: index '某分区表索引名' or partition of such index is in unusable state

最近工作中遇到一个Oracle的数据库问题


逻辑背景:

     由于Performance 原因重构一些数据库表(其中包含了一些分区数据表) 同级联删除旧的index 和 新建了index.

     程序执行:

       1 check and truncate by partition (DDL)

       2 bacth insert

问题现象: 

     步骤2出现  java.sql.SQLException: java.sql.BatchUpdateException: ORA-01502: index 'A' or partition of such index is in unusable state


分析:

     debug 到步骤1 完:

                     select status from user_indexes where index_name in ( 'A', 'A2‘);  发现状态变为 unusable.

     DB上rebuild unusable的index, such as:

               alter index A rebuild;
               alter index A2 rebuild;
     继续执行步骤2 无exception.


     查询相关分区表的所有索引状况:

     ALTER TABLE A表
     ADD CONSTRAINT A PRIMARY KEY(主键字段);

     CREATE INDEX A2 ON A表(索引字段);     

     其他分区表:

     ALTER TABLE B表
     ADD CONSTRAINT B PRIMARY KEY(主键字段)
     USING INDEX LOCAL;

     CREATE INDEX B2 ON B表(索引字段) LOCAL;


     由于本人不是DBA,所以采取了比较分析的办法,大致找到解决办法。 重建分区索引加上Local, 因为重建表的分析索引时脚本丢失了这个关键字。


 根本原因:

     和DBA沟通后得知。 当我们的表为分区表的时候, 所有用到与分区字段有关的 索引要创建为 本地索引。 否则, 默认为全局索引, 这样一旦有相关的 更新分区数据的DDL (比如 步骤1中执行的是:alter table A表 truncate partition for (分区ID)。) 造作会导致这样的全局索引失效。

    

    

 

   



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值