ITPub博客

首页 > 数据库 > Oracle > 创建索引意外终止解决方法

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

原创 Oracle 作者:531968912 时间:2016-06-07 19:17:52 0 删除 编辑
今天在重建索引的时候遭遇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博客 ” ,链接:https://blog.itpub.net/25462274/viewspace-2117050/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-09-24

  • 博文量
    576
  • 访问量
    1111419