数据库中怎么清除创建失败的索引

34次阅读
没有评论

共计 1668 个字符,预计需要花费 5 分钟才能阅读完成。

这篇文章主要介绍了数据库中怎么清除创建失败的索引,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。

在创建一张大表的索引时,因为没有加并行而导致创建时间很长,这时候如果终止操作,比如直接关闭终端,然后再次登录创建时就会报错 ORA-00095 提示对象名字已被用,而去删除对象时又报错 ORA-08104 索引正在被创建。

SQL  drop index xxx.BM_IX;
drop index xxx.BM_IX
 *
ERROR at line 1:
ORA-08104: this index object 1443829 is being online built or rebuilt
SQL  select object_id from dba_objects where object_name= BM_IX 
 OBJECT_ID
----------
 1443829
$ oerr ora 08104
08104, 00000,  this index object %s is being online built or rebuilt 
// *Cause: the index is being created or rebuild or waited for recovering 
// from the online (re)build 
// *Action: wait the online index build or recovery to complete

从 oerr 工具看到的 ORA-08104 的解释是索引并没有创建失败,而是在终端关闭之后,创建的操作还在继续进行。创建或者重建索引时,系统会创建一个临时日志表,这张表被用于存放创建或者重建索引期间产生的日志信息,同时在基表 IND$ 中这个索引的 FLAG 字段上会被设置为 BUILD 或者 REBUILD 标识,当索引信息变更时会把变更信息存入日志表。如果索引创建或者重建失败,这个日志表和数据字典中的状态位都需要后台进程 smon 进行清理。

因此这里的索引不能被删除是因为后台进程 smon 还没来得及清理相应的临时段和标志位,认为 online rebuild 操作还在进行。

那么现在如何终止 rebuild index 这一操作?查找 metalink 得到一篇文档:ORA-600 [12813] When Dropping A Table Partition After a Failed IndexRebuild (文档 ID 803008.1)。它给出了两种方法:

1)使用包 dbms_repair 包来清理

如果在出现问题的对象的数据库活动能停下来,则直接简单地执行如下语句即可:

connect / as sysdba
select dbms_repair.online_index_clean(problem index object_id) from dual; 
exit

2)使用 PL/SQL block 调用 dbms_repair 包来清理

如果在出现问题的对象的数据库活动不能停下来,则如下的 PL/SQL block 来处理

注:加上 dbms_repair.lock_wait 表示不是立刻清理,需要不断的寻找资源锁,直到抢到为止

declare
 isClean boolean;
begin
 isClean := FALSE;
 while isClean=FALSE loop
isClean := dbms_repair.online_index_clean(dbms_repair.all_index_id,
 dbms_repair.lock_wait);
dbms_lock.sleep(2);
 end loop;
 exception 
when others then 
 RAISE; 
/

感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“数据库中怎么清除创建失败的索引”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-26发表,共计1668字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)