今天在重建索引的时候遭遇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 操作系统的方式来直接结束进程,否则可能遇到不可避免的麻烦。
阅读(8191) | 评论(0) | 转发(0) |