创建索引意外终止解决方法

今天在重建索引的时候遭遇ORA-08104错误。
问题产生如下:
下班同事说有几个索引是失效的。回到家中打开电脑,发现有个全局索引的几个分区的索引状态处于UNUSABLE中。 然后我讲将处于失效状态的分区摘出来,写了一个简单脚本。
类似:
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P81 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P80 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P79 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P78 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P77 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P76 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P75 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P74 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P73 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P72 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P71 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P70 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P84 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P83 PARALLEL 4 ONLINE;
ALTER INDEX IDX_MKT_EXEC_01 REBUILD PARTITION SYS_P82 PARALLEL 4 ONLINE;
 
重建过程中发现很慢,每一个分区都是走的全表扫描。
因此想通过删掉索引然后再创建索引的方式来加快索引的建立。
我采用ps -ef | grep LOCAL=YES 的方式找到本地登录的重建索引的进程ID。
然后想也没想的就采用kill -9 pid 的方式结束了重建索引的进程。
 
然后杯具出现了
SQL> drop INDEX IDX_MKT_EXEC_01;   
drop INDEX  IDX_MKT_EXEC_01
                    *
ERROR at line 1:
ORA-08104: this index object 88214 is being online built or rebuilt
异常终止的在线重建索引导致SMON进程没有将索引的重建标志改回来,ORACLE认为索引还在ONLINE REBUILD中,禁止删除索引。
如果不着急的话,可以等待SMON进程自己去清理。
如果着急的话可以采用如下的方法来清理重建索引的标志位:
SQL> declare
  2    done boolean;
  3  begin
  4    done:=dbms_repair.online_index_clean(88214);
  5  end;
  6  /
PL/SQL procedure successfully completed.
 
Elapsed: 00:00:00.43
 
再次删掉索引,成功。
 
SQL> drop INDEX  IDX_MKT_EXEC_01;
 
Index dropped.
 
 
 
在生产环境中,应该尽量避免KILL 操作系统的方式来直接结束进程,否则可能遇到不可避免的麻烦。



在sys用户下执行下面的脚本
DECLARE 
  RetVal BOOLEAN;
  OBJECT_ID BINARY_INTEGER;
  WAIT_FOR_LOCK BINARY_INTEGER;
BEGIN 
  OBJECT_ID := 67420;
--  我的数据库中非法索引的id为67420.
  WAIT_FOR_LOCK := NULL;
  RetVal := SYS.DBMS_REPAIR.ONLINE_INDEX_CLEAN ();
  COMMIT; 
END; 



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25462274/viewspace-2117050/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25462274/viewspace-2117050/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值