请教一个ORACLE的index 分区的问题ORA-01502: index 'TACFM.PK_ALARM_ARCHIVE' or partition of such index is in unusable state我已将 PK_ALARM_ARCHIVE重建了:SQL>alter index PK_ALARM_ARCHIVE rebuild;结果第二天0点(昨天转今天时)仍然报错是为何?分区已存在:
 partition P20100511
    tablespace INS_DATA
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition P20100512
    tablespace INS_DATA
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition P20100513
    tablespace INS_DATA
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),

解决方案 »

  1.   

    表分区表变动,引起索引实效。
    把建表和建索引贴上来,还有0点有没有对表做ddl操作。
      

  2.   

    -- Create table
    create table ARCHIVE
    (
      ID              NUMBER(16) not null,
      SOURCE_ID       VARCHAR2(64) not null,
      USER_LABEL      VARCHAR2(128) not null,
      ALARM_ID        VARCHAR2(64),
      PRIORITY        NUMBER(3) not null,
      SUMMARY         VARCHAR2(256) not null,
      DETAILS         VARCHAR2(4000),
      MEDIATION_TIME  DATE not null
    )
    partition by  (MEDIATION_TIME)
    (
      partition P20100313
        tablespace INMS_DATA
        pctfree 10
        initrans 1
        maxtrans 255
        storage
        (
          initial 64K
          minextents 1
          maxextents unlimited
        ),
      ........
      partition P20100511
        tablespace INMS_DATA
        pctfree 10
        initrans 1
        maxtrans 255
        storage
        (
          initial 64K
          minextents 1
          maxextents unlimited
        ),
      partition P20100512
        tablespace INMS_DATA
        pctfree 10
        initrans 1
        maxtrans 255
        storage
        (
          initial 64K
          minextents 1
          maxextents unlimited
        ),
      partition P20100513
        tablespace INMS_DATA
        pctfree 10
        initrans 1
        maxtrans 255
        storage
        (
          initial 64K
          minextents 1
          maxextents unlimited
        ),
      ........
      partition P20100522
        tablespace INMS_DATA
        pctfree 10
        initrans 1
        maxtrans 255
        storage
        (
          initial 64K
          minextents 1
          maxextents unlimited
        )
    )
    ;
    alter table ARCHIVE
      add constraint PK_ARCHIVE primary key (ID, SOURCE_ID, USER_LABEL, SUMMARY, MEDIATION_TIME)
      using index 
      tablespace INMS_DATA
      pctfree 10
      initrans 2
      maxtrans 255
      storage
      (
        initial 64K
        minextents 1
        maxextents unlimited
      );
      

  3.   

    ddl很多吗?有没有相关的job动作? 因为很多人维护分区表喜欢写脚本自动加partitoin, 结果造成global index出现unusable
      

  4.   

    如果你使用direct 模式load数据时也会出现这个情况 。如insert appendsqlldr 
      

  5.   

    如果你使用direct 模式load数据时也会出现这个情况 。如insert appendsqlldr 
      

  6.   

    没有相关的JOB动作,就是昨天转今天的0点会出现这样的情况
      

  7.   

     不应该啊,那应用总在跑吧。没有job,有没有其他的计划任务或者crontab?实在不行你就打开trace吧,看看这个点数据库在做什么操作。跟几分钟再把trace关掉。要不然暴占空间。
      

  8.   

    我估计谁add or drop 了partition, 但是忘了rebuild global index
      

  9.   

    上面你给的分区不知道是对表的分区还是对索引的分区,如果是对索引的分区,在对索引重新编译的时候,需要对每个索引分区分别rebuild才可以。按照提示的错误,估计你是分区索引,需要找出分区的名称列表通过查询:
    SELECT t.partition_name FROM user_tab_partitions t
    WHERE t.table_name=upper('表名称');找到有那些分区,可以自己写个过程也可,
    然后使用语法:
    ALTER INDEX <索引名称> REBUILD PARTITION <分区名称>;
    如果是全局索引是可以重新编译的。和你语法一致:
    ALTER INDEX <索引名称> REBUILD;