zoukankan      html  css  js  c++  java
  • 10G rebuild index online 会锁表

    rebuild和rebuild online的区别
     
    1、当rebuild 时一般对原先索引进行INDEX FAST FULL SCAN。
    2、当rebuild online的时不用原先索引而执行TABLE ACCESS FULL
    3、rebuild和rebuild online都会发生sort,即需要用到temp表空间。
    4、rebuild 会阻塞dml语句而rebuild online则不会。
    5、rebuild online时系统会产生一个SYS_JOURNAL_xxx的IOT类型的系统临时日志表,所有rebuild online时索引的变化都记录在这个表中,当新的索引创建完成后,把这个表的记录维护到新的索引中去,然后drop掉旧的索引,rebuild online就完成了。
    在Oracle10g中,rebuild/create index online 需要特别小心
     
    session 1 update一行,不提交---这个时候获得表的row exclusive锁
     
    SQL> update test set owner='SB' where object_id=100;
     
    已更新16行。
     
    已用时间: 00: 00: 00.15
     
    session 2 对表上面的索引rebuild online
     
    SQL> alter index idx rebuild online;
     
    等待中...
     
    session 3 对表又进行dml操作
     
    SQL> update test set owner='LUOBINGSEN' where object_id=10;
     
    也等待...
     
    查询锁等待的信息:
     
    SQL> select oracle_username username,session_id sid,decode(
      2 locked_mode,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',
      3 5,'Share Row Exclusive',6,'Exlusive') lock_type,object_name,xidusn,xidslot,xidsqn
      4 from v$locked_object,dba_objects
      5 where v$locked_object.object_id=dba_objects.object_id;
     
    USERNAME SID LOCK_TYPE OBJECT_NAME XIDUSN XIDSLOT XIDSQN
    -------------------- ---------- --------------- ------------------------------ ---------- ---------- ----------
    SCOTT 148 Row share TEST 0 0 0
    SCOTT 148 Row share TEST 0 0 0
    SCOTT 148 Row share TEST 0 0 0
    SCOTT 148 Row share TEST 0 0 0
    SCOTT 148 Row share TEST 0 0 0
    SCOTT 148 Row share TEST 0 0 0
    SCOTT 148 Row share TEST 0 0 0
    SCOTT 148 Row share TEST 0 0 0
    SCOTT 148 Row share TEST 0 0 0
    SCOTT 148 Row share TEST 0 0 0
    SCOTT 145 Row Exclusive TEST 10 47 448
    SCOTT 148 Row share TEST 0 0 0
    SCOTT 145 Row Exclusive TEST 10 47 448
    SCOTT 148 Share SYS_JOURNAL_53286 0 0 0
     
    查询谁阻塞了谁
     
    SQL> SELECT DECODE(request,0,'Holder: ','Waiter: ')|| sid as sid, id1, id2, lmode,
      2 request, type FROM V$LOCK WHERE (id1, id2, type) IN
      3 (SELECT id1, id2, type FROM V$LOCK WHERE request>0) ORDER BY id1, request;
     
    SID ID1 ID2 LMODE REQUEST TY
    ------------------------------------------------ ---------- ---------- ---------- ---------- --
    Holder: 145 53207 0 3 0 TM
    Waiter: 150 53207 0 0 3 TM
    Waiter: 148 53207 0 2 4 TM
     
    可以看到,session 145 获得了 mode=3 也就是 row exclusive 模式的锁 session 148想获得 mode=4 也就是共享锁,
    但是只得到了 mode=2 的行共享锁,session 150 想获得 mode=3 row exclusive锁,但是未获得,处于等待中。
    所以,在Oracle10g中,rebuild index online是一个危险的动作,特别是热点表上面的索引,不要去rebuild/create index online
     
     ------------
    |在Oracle11g |
     ------------
     
    session 1 update一行,不提交
     
    SQL> update test set owner='SB' where object_id=10;
     
    已更新 1 行。
     
    session 2 对表上面的索引rebuild online
     
    SQL> alter index idx rebuild online;
     
    等待中......
     
    session 3 对表又进行dml操作
     
    SQL> update test set owner='SB' where object_id=1;
     
    已更新0行。
     
    发现11g rebuild index online不阻塞dml
     
    SQL> SELECT DECODE(request, 0, 'Holder: ', 'Waiter: ') || sid as sid,
      2 id1,
      3 id2,
      4 lmode,
      5 request,
      6 type,
      7 ctime
      8 FROM V$LOCK
      9 WHERE (id1, id2) IN (SELECT id1, id2 FROM V$LOCK WHERE request > 0)
     10 ORDER BY id1, ctime desc;
     
    SID ID1 ID2 LMODE REQUEST TYPE CTIME
    ------------------------------ ---------- ---------- ---------- ---------- ---- ----------
    Holder: 26 327696 811 6 0 TX 1148
    Waiter: 15 327696 811 0 4 TX 1119
     
    到了Oracle11g,create/rebuild index online 是由以前的 mode=4 的 TM lock变成了 mode=4 的TX lock
    MODE=4 的 TM lock 相当于给表(TM)加了共享锁,这个时候会阻塞其他会话插入,MODE=4 的 TX LOCK 相当于给行(TX)加的是共享锁,当然可以插入了。
     
     
  • 相关阅读:
    b_lc_带阈值的图连通性(反向思维+并查集)
    b_lc_无矛盾的最佳球队(排序+LIS)
    b_lq_子串分值(记录当前字符的出现的前一个位置+组合数学)
    多测师讲解python _课堂练习题梳理_高级讲师肖sir
    多测师讲解python _常见的正则表达式_高级讲师肖sir
    多测师讲解 _python常见的加密方式_高级讲师肖sir
    多测师讲解python _100道题_高级讲师肖sir
    前端 CSS 一些标签默认有padding
    前端 CSS 盒子模型
    Linux ulimit 命令 限制系统用户对 shell 资源的访问
  • 原文地址:https://www.cnblogs.com/l10n/p/12612022.html
Copyright © 2011-2022 走看看