rebuild index online说是不阻塞DML语句的执行,但是在开始和结束阶段需要获得类型为4的TM锁,如果此时有另外事务执行没有及时提交,或者比较大则有可能阻塞rebuild index,下面来重现这种情况。
首先准备一张有点大的表,并建立一个索引,目的是使索引重建过程尽可能的长。
SQL> create table t_objects as select * from dba_objects;
SQL> insert into t_objects select * from t_objects;
SQL> /
SQL> /
SQL> commit;
SQL> create index ind_t_objects on t_objects(object_id);
然后打开3个session,在session 1中执行:
SQL> select max(sid) from v$mystat;
目的是获得当前session的sid,同样需获得session 2的sid,然后开始rebuild索引:
SQL> alter index ind_t_objects rebuild online;
赶紧去session 3中查看:
SQL> select b.sid, a.object_name, b.id1, b.type, b.lmode, b.request, b.ctime, b.block from dba_objects a, v$lock b where a.object_id(+)=b.id1 and (b.sid=1090 or b.sid=1078);
SID OBJECT_NAME ID1 TY LMODE REQUEST CTIME BLOCK
---------- ------------------ ---------- -- ---------- ---------- ---------- ----------
1078 T_OBJECTS 11096 TM 2 0 0 0
1078 T_OBJECTS 11096 DL 3 0 1 0
1078 T_OBJECTS 11096 DL 3 0 1 0
1078 SYS_JOURNAL_11116 11210 TM 4 0 0 0
现在session 1(sid 1078 )在T_OBJECTS上加的TM锁的lmode是2,而session 2由于没有执行任何操作,还没有锁信息。
然后去session 2中执行一条如下语句:
SQL> insert into t_objects select * from t_objects where rownum < 2;
不提交,再去session 3中查看:
SQL> select b.sid, a.object_name, b.id1, b.type, b.lmode, b.request, b.ctime, b.block from dba_objects a, v$lock b where a.object_id(+)=b.id1 and (b.sid=1090 or b.sid=1078);
SID OBJECT_NAME ID1 TY LMODE REQUEST CTIME BLOCK
---------- ------------------ ---------- -- ---------- ---------- ---------- ----------
1078 TAB$ 4 TS 6 0 12 0
1090 T_OBJECTS 11096 TM 3 0 14 1
1078 T_OBJECTS 11096 TM 2 4 14 0
1078 T_OBJECTS 11096 DL 3 0 15 0
1078 T_OBJECTS 11096 DL 3 0 15 0
1078 SYS_JOURNAL_11116 11210 TM 4 0 14 0
1090 196640 TX 6 0 14 0
1078 458755 TX 6 0 12 0
可以看到session 2(sid 1090 )阻塞了session 1(session 2的block字段值为1),session 1请求的TM锁的类型为4,与session 2持有的类型为3的TM锁不兼容,因此造成了session 1的等待。
在session 2中执行commit或rollback,随后session 1的索引rebuild过程顺利完成,因此在rebuild索引的时候尽量要选择在系统闲的时候进行,如果出现阻塞可以先把造成阻塞的会话kill掉。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/339291/viewspace-545479/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/339291/viewspace-545479/