ORA-08104: 该索引对象68100 正在被联机建立或重建

测试人员报告某个sql查询操作比较慢,希望协助查找一下原因。

检查发现IDX_LOG_BUSINON 碎片较为严重,决定重建索引。

为了不影响大家使用,决定用rebuild online的方式重建该索引。

 

 

连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> alter index IDX_LOG_BUSINON rebuild online ;

 

一会有人来叫去会议室讨论影像迁移的问题,与是拔掉网线拿起笔记本去了

会议室。到了会议室发现这个会话已经断开了。找根网线插上继续rebuild索引。

 

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

 

检查了一下68100对象,发现就是要rebuild的那个索引。

 

SQL> select OWNER, OBJECT_NAME, OBJECT_ID, OBJECT_TYPE
  2    from dba_objects o
  3   where o.object_id = '68100';

OWNER    OBJECT_NAME         OBJECT_ID OBJECT_TYPE
-------- ------------------ ---------- -----------
REPORT   IDX_LOG_BUSINON         68100 INDEX

 

 

由于之前在ORACLE 10g 上遇到过这个问题,所以觉得没啥。直接用

DBMS_REPAIR.ONLINE_INDEX_CLEAN 清理掉,在重建就好了。

 

SQL> desc dbms_repair

。。。省略部分描述
 FUNCTION ONLINE_INDEX_CLEAN RETURNS BOOLEAN


参数名称                            类型                       输入/输出默认值?
------------------------------ ----------------------- ------ --------
 OBJECT_ID                      BINARY_INTEGER          IN     DEFAULT
 WAIT_FOR_LOCK             BINARY_INTEGER          IN     DEFAULT

 

说明:DBMS_REPAIR.ONLINE_INDEX_CLEAN ()要求有返回值。


SQL> DECLARE
  2    RetVal BOOLEAN;
  3    OBJECT_ID BINARY_INTEGER;
  4    WAIT_FOR_LOCK BINARY_INTEGER;
  5 
  6  BEGIN
  7    OBJECT_ID := 68100;
  8    WAIT_FOR_LOCK := NULL;
  9    RetVal := SYS.DBMS_REPAIR.ONLINE_INDEX_CLEAN ();
 10    COMMIT;
 11  END;
 12  /

继续开会。。。大约20分钟会议结束。感觉索引应该rebuild结束。

但还没执行完,这时候突然紧张起来了。赶紧去看alert*.log没发现

有异常。什么原因呢,测试环境中这张表的数据并不多,应该很快就能

搞定的。为什么这么长时间还没完呢。是不是有人锁表了呢。

 

 

SQL> SELECT /*+ rule */
  2         s.username,
  3         decode(l.type, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) LOCK_LEVEL,
  4         o.owner,
  5         o.object_name,
  6         o.object_type,
  7         s.sid,
  8         s.serial#,
  9    FROM gv$session s, gv$lock l, dba_objects o
 10   WHERE l.sid = s.sid
 11     AND l.id1 = o.object_id(+)
 12     AND s.username is NOT NULL ;

USERNAME    LOCK_LEVEL OWNER      OBJECT_NAME        OBJECT_TYPE    SID  SERIAL#
----------- ---------- ---------- ------------------ ------------ ----- --------
REPORT                 REPORT     WFLOG              TABLE          154      159
REPORT                 SYS        TAB$               TABLE          154      159
REPORT                 REPORT     WFLOG              TABLE          154      159
REPORT      TABLE LOCK REPORT     SYS_JOURNAL_68100  TABLE          154      159
REPORT      ROW LOCK                                                154      159
REPORT      TABLE LOCK REPORT     WFLOG              TABLE          154      159
REPORT      ROW LOCK                                                138       10
REPORT      TABLE LOCK REPORT     WFLOG              TABLE          138       10

 

果然有人锁表了,找到那个哥们,发现她刚才也来开会了。她commit后,果然很快清理完了。

再次rebuild 这个索引,也很快搞定。

 

SQL> alter index IDX_LOG_BUSINON rebuild online ;

 

 

总结: 幸亏是赶在快吃饭时间用测试库的人比较少,影响比较小。

          要是在生产库上就是一次严重的事故了。不过在生产库上

          有严格的审批流程,没人敢去轻易操作。

 

结论:做事情要一心一意,不能分心。尤其是操作数据库。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值