ORA-8104/ORA-8106的处理

ORA-8104/ORA-8106的处理
【分类信息】 故障处理

在生产环境下重建索引是十分危险的,一旦出现故障,将十分麻烦。所以老白很少在生产时间重建较大的索引。一旦ALTER INDEX ... REBUILD ONLINE失败,那么就可能碰到一个十分严重的问题。重新做索引重建会报ORA-8104/8106错误,导致无法重建索引。直到SMON清理了上回失败的现场才能进行重建。在10.2版本里,Oracle提供了一个 dbms_repair.online_index_clean来解决这个问题。对于9.2版本,BUG3805539曾经提出为9.2版本出一个补丁的请求,不过Oracle拒绝了这个补丁请求。所以在9.2里,只能采取下列方法来处理:

停应用,重启数据库,在SMON完成清理前不要启动应用。

有一个手工的方法有可能不需要停库,不过这个方法不是100%成功的,如果日志表比较忙就无法处理了。首先我们要了解REBUILD ONLINE失败后哪些地方受到了影响,首先ind$中这个索引的FLAGS被加上了512,另外会在这个用户下产生一张日志表sys_journal_。我们要做的工作就是清除这两个部分。

sql>update ind$ set flags=flags-512 where obj#=; /* 首先要确认flags>512如果不是,说明这个标志是正常的*/

sql>drop table .sys_journal_; /*这个步骤可能会报资源忙,因为有大量的日志正在插入,可以反复重试一下 */

在9.2.0.8下的HP-UX PA-RISC(64 BIT)和SUN SPARC环境下,是有一个补丁包,可以实现类似10.2的功能的,补丁包是7362402,这个补丁包是一个MLR,包含了bug 5597450 bug 6338480 ,其中6338480就是针对ORA-8104/8106的。安装了这个补丁包后就可以执行那个存储过程来清理了。如果那个存储过程不存在,可以通过下面的方法:

SQL> oradebug setmypid

SQL> oradebug call kdic_ext_cleanup object_id wait_for_lock

.

其中

object_id : 0 : cleanup 所有的

> 0 : cleanup 某个OBJECT_ID

wait_for_lock : 1 : 无法获得DML锁的时候进行重试,直到达到内部限制才失败

0 : 不重试,马上失败

[@more@]

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

转载于:http://blog.itpub.net/12482/viewspace-1046665/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值