细说ora-08104错误

在线重建索引 (alter index index_name rebuild online)虽然延长了索引重建的时间,却也赋予了我们在线重建索引,提高数据可用性的能力。如果在联机重建索引的过程中出现错误,如用户终止,网络中断等,那么当我们再次重建索引时,有可能会产生ORA-08104错误。这是由于先前的操作痕迹没有清除而造成的。

在线重建索引的过程中,oracle数据库会修改数据字典表,并生成中间表(IOT)来记录索引重建期间发生的dml操作。如果重建过程异常中断,smon进程会清理重建痕迹,但是如果系统非常繁忙导致smon应接不暇或者dml操作过多导致smon无法获取相关表上的锁,从而无法清理重建痕迹,当我们再次重建索引时,就会产生ora-08104错误。

下面我们构造一个ora-08104错误

--session 1
SQL> alter index ind1 rebuild online;
--session 2
SQL> update tab1 set rn = rn+1;
--session 1 网络故障,断线
--session 2
SQL> update tab1 set rn = rn+1;

已更新499999行。

SQL> COMMIT;
--session 3
SQL> alter index ind1 rebuild online;
alter index ind1 rebuild online
*
第 1 行出现错误:
ORA-08104: 该索引对象 87859 正在被联机建立或重建

要解决ora-08104错误,就要清除重建痕迹,总结方法如下:

  • ONLINE_INDEX_CLEAN Function

This function performs a manual cleanup of failed or interrupted online index builds or rebuilds. This action is also performed periodically by SMON, regardless of user-initiated cleanup.

This function returns TRUE if all indexes specified were cleaned up and FALSE if one or more indexes could not be cleaned up.

Syntax

DBMS_REPAIR.ONLINE_INDEX_CLEAN (
   object_id      IN BINARY_INTEGER DEFAULT ALL_INDEX_ID,
   wait_for_lock  IN BINARY_INTEGER DEFAULT LOCK_WAIT)
 RETURN BOOLEAN;

Parameters

Table 79-8 ONLINE_INDEX_CLEAN Function Parameters

ParameterDescription

object_id

Object id of index to be cleaned up. The default cleans up all object ids that qualify.

wait_for_lock

This parameter specifies whether to try getting DML locks on underlying table [[sub]partition] object. The default retries up to an internal retry limit, after which the lock get will give up. If LOCK_NOWAIT is specified, then the lock get does not retry.

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(10);
end loop;
 10  end;
 11  /

PL/SQL 过程已成功完成。

注意事项:在执行过程中,需要在索引所在表上获取锁,因此应尽可能的保证索引表不被其他事务锁定,以尽快清理临时数据,如果长时间不能清除数据,查看后台日志,我们会发现

online index (re)build cleanup: objn=87859 maxretry=2000 forever=0
Thu Nov 21 14:36:58 2013
online index (re)build cleanup: objn=87859 maxretry=2000 forever=0
Thu Nov 21 14:38:45 2013
online index (re)build cleanup: objn=87859 maxretry=2000 forever=0
Thu Nov 21 14:39:10 2013
online index (re)build cleanup: objn=87859 maxretry=2000 forever=0
Thu Nov 21 14:45:32 2013
online index (re)build cleanup: objn=87859 maxretry=2000 forever=0
Thu Nov 21 14:49:07 2013
online index (re)build cleanup: objn=87859 maxretry=2000 forever=0
Thu Nov 21 14:50:54 2013
online index (re)build cleanup: objn=87859 maxretry=2000 forever=0
Thu Nov 21 14:54:19 2013
online index (re)build cleanup: objn=87859 maxretry=2000 forever=0
Thu Nov 21 14:57:44 2013
online index (re)build cleanup: objn=87859 maxretry=2000 forever=0

  • 手工修改数据字典,清除中间表
sql>update ind$ set flags=flags-512 where obj#=<object id>; /* 首先要确认flags>512如果不是,说明这个标志是正常的*/
sql>drop table <owner>.sys_journal_<object_id>; /*这个步骤可能会报资源忙,因为有大量的日志正在插入,可以反复重试一下 */

注意顺序操作顺序,不到万不得已,不要修改数据字典

  • 唤醒SMON   

我们可以尝试使用ORADEBUG WAKEUP 来唤醒smon,可以多试几次


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值