ITPub博客

首页 > Linux操作系统 > Linux操作系统 > rebuild index online阻塞情况分析

rebuild index online阻塞情况分析

原创 Linux操作系统 作者:xfxyxh 时间:2009-02-06 13:41:47 0 删除 编辑

        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/,如需转载,请注明出处,否则将追究法律责任。

上一篇: LOCK
请登录后发表评论 登录
全部评论

注册时间:2007-12-13

  • 博文量
    21
  • 访问量
    85142