Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2837772
  • 博文数量: 599
  • 博客积分: 16398
  • 博客等级: 上将
  • 技术积分: 6875
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-30 12:04
个人简介

WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606

文章分类

全部博文(599)

文章存档

2014年(12)

2013年(56)

2012年(199)

2011年(105)

2010年(128)

2009年(99)

分类: Oracle

2011-11-15 20:29:46


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