向大师致敬,向大师学习!!!

dml操作时,undo究竟是如何工作的(一)?

上一篇 / 下一篇  2008-01-18 08:46:28 / 个人分类:数据库(oracle)

Undo初步研究一

Dml语句涉及的undo操作,大致有如下五点描述,但此仅仅是一些轮廓性的描述,用来学习记录之用,更深入,更细节的部分,诸如延迟块清除,redoundo的配合等等,还需要做更多实验,看更多大师们的著作。

 

:如果sql涉及的block不在database buffer

         cache中,则从数据文件中读取进缓存。

(如果缓存的空间不够,就要涉及oracle

   内存空间的管理)。

:在回滚段的事务表上为该事务分配一个事务槽,事务槽中记录了事务槽号,前镜像的地址(dba)等信息,在undo block的头部有xid,记录该块对应的事务槽号(事务信息,回滚段头,回滚段事务表的事务槽,回滚段块有机的联系在一起);在回滚记录(undo recoder)中记录有对应的数据块地址(bdba)。

:在数据块中分配itl槽,进行行锁定。itl中包含xiduba等信息,xid中包含了对应事务的回滚段号,事务槽号,uba对应回滚段信息;由此我们可以看出,在data block的块头中有指向前镜像的uba信息,同时,在回滚段的回滚记录中,也有指向data block的地址。

:dml database buffer cache中的记录。

:若事务rollback,则从回滚段中取得前镜像来覆盖database buffer cache;若commit,则释放回滚段事务表上的事务槽,释放数据块中的itl,重置行记录上的锁定位(lb

 

本文是在参考eygle大师的《dba入门,进阶与诊断案例》》一书基础上完成的。的以下实验,作为学习记录之用,仅作参考。

 

Session 1,用scott连进去

SQL> UPDATE EMP SET SAL=5000 WHERE EMPNO=7782;

 

已更新1行。

查询该sessionid和对应的事务号

SQL> SELECT SID,SERIAL#,TADDR FROM V$SESSION WHERE USERNAME='SCOTT';

 

      SID   SERIAL# TADDR

---------- ---------- --------

        9         9 67B7A1FC

session 2,同样用scott连进去

SQL> UPDATE EMP SET SAL=4500 where empno=7876;

 

已更新1行。

SQL> SELECT SID,SERIAL#,TADDR FROM V$SESSION WHERE USERNAME='SCOTT' AND SID<>9;

 

      SID   SERIAL# TADDR

---------- ---------- --------

       13        25 67B8DB1C

 

sys登录,查看v$transaction

SQL> select * from v$transaction;                                                           

ADDR        XIDUSN   XIDSLOT    XIDSQN    UBAFIL    UBABLK    UBASQN    UBAREC STATUS

-------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ------

67B7A1FC        10        43       308         2       168        62        32 ACTIVE

67B8DB1C         1        21       309         2        10        66        39 ACTIVE

 

可以看到第一个session对应10号回滚段的43号事务槽,第二个session对应1号回滚段的21号事务槽。

v$rollstat也可以看到相对应的信息

SQL> select * from v$rollstat;                                                        

                                                                                      

      USN     LATCH   EXTENTS    RSSIZE    WRITES     XACTS      GETS     WAITS

---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------

        0         0         6    385024      4520         0        57         0

        1         1         8    516096     57910         1       904         0

        2         2         8    516096     85662         0      1345         0

        ---------- ---------- ---------- ---------- ---------- ---------- ---------- -------------------- ---------- ---------- ---------- ----- 

       ---------- ---------- ---------- ---------- ---------- ---------- ---------- -------------------- ---------- ---------- ---------- -----

      9         0         8    516096     83482         0      1340         0

       10         1         7    450560     35204         1       573         0

 

其中xact=0表示空闲的回滚段,当前没有事务,xact=1表示当前活动的回滚段,usnundo segment number)为回滚段号,resize为回滚段大小。

 

查询v$rollname,获取回滚段名称

 

SQL> select * from v$rollname;    

                                  

      USN NAME                   

---------- ------------------------

        0 SYSTEM                 

        1 _SYSSMU1$              

        2 _SYSSMU2$              

     。。。。。。。。。。。。。。。。。

        9 _SYSSMU9$              

       10 _SYSSMU10$             

 11 rows selected         

 

转储 _SYSSMU1$_SYSSMU10$回滚段头

SQL> alter system dump undo header "_SYSSMU1$";

 

System altered

 

SQL> alter system dump undo header "_SYSSMU10$";

 

System altered

 

SQL>

分别另存undo_header_before_commit_SYSSMU1$undo_header_before_commit_SYSSMU10$

 

********************************************************************************

Undo Segment: _SYSSMU1$ (1)

********************************************************************************

 Extent Control Header

 -----------------------------------------------------------------

 Extent Header:: spare1: 0     spare2: 0     #extents: 8     #blocks: 63   

                 last map 0x00000000 #maps: 0     offset: 4080 

     Highwater:: 0x0080000a ext#: 0     blk#: 0     ext size: 7    

 #blocks in seg. hdr's freelists: 0    

 #blocks below: 0    

 mapblk 0x00000000 offset: 0    

                  Unlocked

 …………………………………………………………………………………………………………..

…………………………………………………………………………………………………………..

 TRN TBL::

 

 index state cflags wrap#   uel        scn           dba           parent-xid   nub    stmt_num

 ------------------------------------------------------------------------------------------------

  

  0x14   9   0x00 0x0135 0xffff 0x0000.0005a352 0x0080000a 0x0000.000.00000000 0x00000001  0x00000000

  0x15  10   0x80 0x0135 0x0000 0x0000.0005a360 0x0080000a 0x0000.000.00000000 0x00000001  0x00000000

  0x16   9   0x00 0x0134 0x0017 0x0000.00059f1e 0x00800618 0x0000.000.00000000 0x00000001  0x00000000

  

回滚段头中分配了一系列的事务槽,index代表事务槽号,16进制的0x15 =21,state=10表示出于活动状态,uba代表了该事务槽对应的前镜像地址,此处的信息和v$transaction完全一致。

 

_SYSSMU10$段头的情况类似,如下:

********************************************************************************

Undo Segment: _SYSSMU10$ (10)

********************************************************************************

    0x2a   9   0x00 0x0134 0xffff 0x0000.0005a114 0x00000000 0x0000.000.00000000 0x00000000  0x00000000

  0x2b  10   0x80 0x0134 0x0001 0x0000.0005a16a 0x008000a8 0x0000.000.00000000 0x00000001  0x00000000

  0x2c   9   0x00 0x0133 0x002d 0x0000.0005911c 0x008000a6 0x0000.000.00000000 0x00000001  0x00000000

  

 

TAG: undo研究

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar