前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【DB笔试面试662】在Oracle中,对于错误“ORA-08104”应该如何处理?

【DB笔试面试662】在Oracle中,对于错误“ORA-08104”应该如何处理?

作者头像
小麦苗DBA宝典
发布2019-10-19 09:30:44
7410
发布2019-10-19 09:30:44
举报

题目部分

在Oracle中,对于错误“ORA-08104: this index object 68111 is being online built or rebuilt”,应该如何处理?(如何清除创建失败的索引?)

答案部分

答案:官方文档的解释:

代码语言:javascript
复制
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进行清理。

代码语言:javascript
复制
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的那个索引:

代码语言:javascript
复制
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种办法。

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

代码语言:javascript
复制
1connect / as sysdba
2select dbms_repair.online_index_clean(<problem index object_id>) from dual; 
3exit

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

代码语言:javascript
复制
 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表示不是立刻清理,需要不断的寻找资源锁,直到抢到为止。

执行完成后,再次执行重建索引的语句即可。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DB宝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档