♣
题目部分
在Oracle中,对于错误“ORA-08104: this index object 68111 is being online built or rebuilt”,应该如何处理?(如何清除创建失败的索引?)
♣
答案部分
答案:官方文档的解释:
108104, 00000, "this index object %s is being online built or rebuilt"
2// *Cause: the index is being created or rebuild or waited for recovering
3// from the online (re)build
4// *Action: wait the online index build or recovery to complete
由此可见,出现该错误的原因是,索引正在被新建或重建或在等待在线重建完成。
在创建或重建索引时,系统会创建一个临时日志表,这张表被用于存放创建或者重建索引期间产生的日志信息,同时在基表IND$中这个索引的FLAG字段上会被设置为BUILD或者REBUILD标识。当索引信息变更时会把变更信息存入日志表。如果索引创建或者重建失败,那么这个日志表和数据字典中的状态位都需要后台进程smon进行清理。
1SQL> ALTER INDEX IDX_LOG_LHRINON REBUILD ONLINE ;
2ALTER INDEX IDX_LOG_LHRINON REBUILD ONLINE
3*
4第 1 行出现错误:
5ORA-08104: this index object 68111 is being online built or rebuilt
可以检查一下68100对象,发现就是要REBUILD的那个索引:
1SQL> SELECT OWNER, OBJECT_NAME, OBJECT_ID, OBJECT_TYPE
2 2 FROM DBA_OBJECTS O
3 3 WHERE O.OBJECT_ID = '68111';
4OWNER OBJECT_NAME OBJECT_ID OBJECT_TYPE
5-------- ------------------ ---------- -----------
6REPLHR IDX_LOG_LHRINON 68111 INDEX
因此,这里的索引不能被在线重建是因为后台进程smon还没来得急清理相应的临时段和标志位,认为ONLINE REBUILD操作还在进行。那么如何终止REBUILD INDEX这一操作呢?在MOS上有一篇文档:“ORA-600 [12813] When Dropping A Table Partition After a Failed IndexRebuild (文档 ID 803008.1)”,给出了2种办法。
如果在出现问题的对象的数据库活动能停下来,则直接简单地执行如下语句即可:
1connect / as sysdba
2select dbms_repair.online_index_clean(<problem index object_id>) from dual;
3exit
如果在出现问题的对象的数据库活动不能停下来,则如下的PL/SQL block来处理:
1declare
2 isClean boolean;
3begin
4 isClean := FALSE;
5 while isClean=FALSE loop
6isClean := dbms_repair.online_index_clean(dbms_repair.all_index_id,
7 dbms_repair.lock_wait);
8dbms_lock.sleep(2);
9 end loop;
10 exception
11when others then
12 RAISE;
13end;
14/
在以上程序中,加上dbms_repair.lock_wait表示不是立刻清理,需要不断的寻找资源锁,直到抢到为止。
执行完成后,再次执行重建索引的语句即可。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有