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
尝试在一个表上通过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博客 ” ,链接:http://blog.itpub.net/8520577/viewspace-2123338/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8520577/viewspace-2123338/