ITPub博客

首页 > 数据库 > Oracle > ORA-08104 指定的索引正在被联机重建或...

ORA-08104 指定的索引正在被联机重建或...

原创 Oracle 作者:abstractcyj 时间:2016-08-11 16:45:10 0 删除 编辑
ORA-08104: this index object 索引# is being online built or rebuilt

尝试在一个表上通过create index .. online创建索引, 之后,因耗时太长,把session杀掉了
drop索引时, 得到错误信息:ORA-08104

可以通过如下脚本进行清理:

DECLARE
  isclean BOOLEAN;
BEGIN
  isclean := FALSE;


  WHILE isclean = FALSE LOOP
    isclean := dbms_repair.online_index_clean(object_id     => dbms_repair.all_index_id,
                                              wait_for_lock => dbms_repair.lock_wait);
    dbms_lock.sleep(10);
  
  END LOOP;
END;


清理之后再次创建,成功

SMON进程有清理临时段的功能,而创建索引时需要使用到临时段
http://www.askmaclean.com/archives/smon-cleanup-temporary-segment.html

根据以上说明,我们可以知道在进行online rebuild 的时候,Oracle 会修改如下信息:
(1)修改ind$中索引的flags,将该flags+512. 关于这个flags的含义,在下面的实验中进行说明。
(2)在该用户下创建一个journal table 来保存在rebuild期间的增量数据。 该表明名称: sys_journal_<object_id>.
 
       如果异常结束online rebuild操作,那么oracle就没及时清理journal table和ind$的flags标志位,系统会认为online rebuild还在操作。

http://www.ningoo.net/html/2007/dba_memo_online_rebuild_index_encounter_ora-08104.html

ORA-08104: this index object 67420 is being online built or rebuilt
这是由于在异常终止online rebuild操作的时候,oracle没来得及清理相应的临时段和标志位,系统认为online rebuild操作还在进行造成的。在Oracle10g之前,对于这种情况没有太好的办法,只有等SMON进程来进行清理了。网上有说上重启可以解决,有说直接update系统表ind$的,对于不能停机的产品库来说,这些都是不可取的方案。重启不现实,修改系统表更是DBA的大忌。Oracle10g则可以使用dbms_repair.online_index_clean手工清理(metalink的说法,9i打了Bug 3805539的patch的话也能用该过程了)。所以,对于大索引的online rebuild,不要轻易中止。否则可能要等上相当一段时间SMON才能完成清理工作,清理完后,可以在alert.log中看到如下记录:


参考:http://agstamy.blogspot.jp/2014/02/ora-08104-after-session-has-been-killed.html
        http://blog.csdn.net/tianlesoftware/article/details/6538928
      http://www.askmaclean.com/archives/smon-cleanup-temporary-segment.html

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

上一篇: Oracle Regexp_Replace
请登录后发表评论 登录
全部评论
曾从事java方向开发多年。近年已经转入数据库方向。主要擅长SQL优化,Oracle数据库问题诊断,Oracle备份与恢复等。服务于医药物流,医院等行业

注册时间:2010-01-26

  • 博文量
    602
  • 访问量
    1091583