UNDO段頭塊格式深度解析

轉載請註明出處http://blog.csdn.net/guoyjoe/article/details/18355579


下面我對UNDO段頭塊的格式做一個全面深入的解析。有助於我們瞭解事務的本質。

好,爲了方便測試,我來創建一個很小的UNDO表空間,如下操作:

gyj@OCM> create undo tablespace undotbs4 datafile '/u01/app/oracle/oradata/ocm/undotbs04.dbf' size 192k;  Tablespace created.  gyj@OCM> alter system set undo_tablespace=undotbs4;  System altered. 

查找UNDO回滾段,有一個17號UNDO回滾段,我們就拿這個回滾段做測試。

gyj@OCM> select * from v$rollname;         USN NAME ---------- ------------------------------          0 SYSTEM         17 _SYSSMU17_3012809736$ 


發生一個事務:

gyj@OCM> update gyj_test set name='guoyJoe' where id=1;

 

1 row updated.

 

轉儲UNDO段頭塊:

gyj@OCM> alter system dump undo header"_SYSSMU17_3012809736$";

 

System altered.

 

找到DUMP的UNDO段頭塊的跟蹤日誌:

gyj@OCM> select * from v$diag_info wherename='Default Trace File';

 

  INST_ID   NAME                          VALUE

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

  1Default Trace File        /u01/app/oracle/diag/rdbms/ocm/ocm/trace/ocm_ora_6151.trc

 

 

   

分析UDNO段頭塊的日誌

[root@mydb ~]# more/u01/app/oracle/diag/rdbms/ocm/ocm/trace/ocm_ora_6151.trc

******************************************************************************** Undo Segment:  _SYSSMU17_3012809736$ (17) ********************************************************************************   Extent Control Header   -----------------------------------------------------------------   Extent Header:: spare1: 0      spare2: 0      #extents: 2      #blocks: 15                       last map  0x00000000  #maps: 0      offset: 4080         Highwater::  0x0280000a  ext#: 0      blk#: 1      ext size: 7        #blocks in seg. hdr's freelists: 0        #blocks below: 0        mapblk  0x00000000  offset: 0                         Unlocked      Map Header:: next  0x00000000  #extents: 2    obj#: 0      flag: 0x40000000 

 #extents: 2  表示17號UNDO段有兩個區

   #blocks: 15   表示17號UNDO回滾段兩個區中有15個UNDO BLOCK可用。(爲什麼不是16個UNDO BLOCK塊呢,去掉一個UNDO段頭塊)

   ext#: 0       表示這個事務發生在第1個區(從0開始)

   blk#: 1       表示這個事務發生在第1個區的第1個塊上。

   ext size: 7     表示1個區上有7個UNDO BLOCK可用

  

   通過v$rollname視圖查出是17號UNDO回滾段

  gyj@OCM> select * from v$rollname;

 

      USN NAME

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

        0 SYSTEM

       17 _SYSSMU17_3012809736$

 

   通過dba_extents視圖查出一共有兩個區,共16個塊

  gyj@OCM> select extent_id,file_id,block_id,blocks,bytes fromdba_extents where segment_name='_SYSSMU17_3012809736$';

 

  EXTENT_ID    FILE_ID  BLOCK_ID     BLOCKS      BYTES

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

        0         10          8          8     65536

        1         10         16          8     65536

 

  通過dba_segments視圖查出UNDO段頭塊,即10號文件的8號塊是UNDO段頭塊(所以#blocks:15)

 gyj@OCM> select header_file,header_block from dba_segments wheresegment_name='_SYSSMU17_3012809736$';

 

 

  HEADER_FILE HEADER_BLOCK

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

        10            8

 

 Extent Map   -----------------------------------------------------------------    0x02800009  length: 7         0x02800010  length: 8   

 17號UNDO回滾段的區地圖一共有兩個區:

   第一個區對應的是10號文件1號塊、2號塊、3號塊、4號塊、5號塊、6號塊、7號塊,共7個UNDO BLOCK

   第一個區對應的是10號文件9號塊、10號塊、11號塊、12號塊、13號塊、14號塊、15號塊,16號塊,共8個UNDO BLOCK

Retention Table    -----------------------------------------------------------  Extent Number:0  Commit Time: 1389838948  Extent Number:1  Commit Time: 1389838948 

 區的提交時間戳,是從1970年1月1號零晨開始的(以秒爲單位記錄)

TRN CTL:: seq: 0x000d chd: 0x000a ctl: 0x000b inc: 0x00000000 nfb: 0x0000             mgc: 0xb000 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)             uba: 0x0280000a.000d.2e scn: 0x0000.0028a2af 

事務控制:

 seq: 0x000d  表示此事務修改前的值所在的UNDOBLOCK塊被覆蓋了13次,與下面的uba: 0x0280000a.000d.2e中的000d對應。

  chd:0x000a  表示發生一個新的事務,此時會在下面的TRNTBL::(事務表)的index=0x000a槽中放入新事務信息,即事務表的鏈頭或叫入口。

 ctl: 0x000b  表示事務表的鏈尾(實際上大家可以去TRN TBL::看index=0x000b,它對應的SCN=0x0000.0028a4d5是本事務表中最大的SCN,即此事務槽最後纔會被覆蓋)

 nfb: 0x0000  表示UNDO塊在空閒池的空閒塊數,0x0000表示池中沒有空閒UNDO塊了,即FREE BLOCKPOOL::沒空閒的塊了。

 flg: 0x0001  表示該塊的用途,1=KTUUNDO HEADER(2=KTU UNDO BLOCK等等)

 uba: 0x0280000a.000d.2e 表示新事務的第一條UNDO記錄(由三部分組成undo塊的地址、UNDO塊被重用的次數、在UNDO塊的第幾條記錄)

      undo塊的地址:        0x0280000a 即10號文件的10號塊

      UNDO塊被重用的次數:  000d       即UNDO塊被覆蓋了13次

      在UNDO塊的第幾條記錄  2e         即在UNDO塊的第46條

 

 scn: 0x0000.0028a2af  表示17號UNDO段頭塊中最小的提交的SCN。實際上這個SCN就是事務表中最小的SCN所對應的事務槽上的SCN

 

    注:下面的事務控制,是我在發生事務前(即做update gyj_test set name='GGGGG' where id=1;前所DUMP的事務控制)

   TRN CTL:: seq: 0x000d chd: 0x0017 ctl: 0x000b inc: 0x00000000 nfb:0x0001

           mgc: 0xb000 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)

           uba: 0x0280000a.000d.2b scn: 0x0000.0028a26a

    OK,我們從chd: 0x0017,找到事務表中的INDEX=0x0017

TRN TBL::

 

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

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

 0x17    9    0x00 0x001c  0x000a  0x0000.0028a2af  0x0280000a 0x0000.000.00000000 0x00000001   0x00000000  1389839441

 

 有沒有發現上面的scn=0x0000.0028a2af,是不是就是我們事務控制中所記錄的SCN,明白了吧,實在不明白的來ORACLE DSI羣討論(羣號127149411)

 

FREE BLOCK POOL::     uba: 0x00000000.000d.2d ext: 0x0  spc: 0x8b8        uba: 0x00000000.000d.0d ext: 0x0  spc: 0x19e8       uba: 0x00000000.0009.08 ext: 0x0  spc: 0x932        uba: 0x00000000.0000.00 ext: 0x0  spc: 0x0          uba: 0x00000000.0000.00 ext: 0x0  spc: 0x0   

UNDO塊的空閒池,當事務做了提交會把此事務所在的UNDO塊加入空閒池中。

 uba:  由三部分組成undo塊的地址、UNDO塊被重用的次數、在UNDO塊的第幾條記錄,當undo塊的地址爲0說明UNDO塊不是空閒的,即0x00000000

 ext:   UNDO塊是在哪個區(extent)

 spc:    UNDO塊中多少空閒空間,單位字節

  從上面的UNDO空閒池中看,沒有空閒的UNDO塊。

 TRN TBL::     index  state cflags  wrap#    uel         scn            dba            parent-xid    nub     stmt_num    cmt   ------------------------------------------------------------------------------------------------    0x00    9    0x00  0x001d  0x001f  0x0000.0028a444  0x02800009  0x0000.000.00000000  0x00000001   0x00000000  138984044 9    0x01    9    0x00  0x001d  0x000e  0x0000.0028a454  0x02800009  0x0000.000.00000000  0x00000001   0x00000000  138984044 9    0x02    9    0x00  0x001d  0x0003  0x0000.0028a448  0x02800009  0x0000.000.00000000  0x00000001   0x00000000  138984044 9    0x03    9    0x00  0x001d  0x0005  0x0000.0028a44a  0x02800009  0x0000.000.00000000  0x00000001   0x00000000  138984044 9    0x04    9    0x00  0x001d  0x000b  0x0000.0028a4d3  0x0280000a  0x0000.000.00000000  0x00000001   0x00000000  138984076 2    0x05    9    0x00  0x001d  0x001d  0x0000.0028a44c  0x02800009  0x0000.000.00000000  0x00000001   0x00000000  138984044 9    0x06    9    0x00  0x001d  0x000d  0x0000.0028a493  0x0280000a  0x0000.000.00000000  0x00000001   0x00000000  138984061 2    0x07    9    0x00  0x001d  0x0008  0x0000.0028a452  0x02800009  0x0000.000.00000000  0x00000001   0x00000000  138984044 9    0x08    9    0x00  0x001d  0x0001  0x0000.0028a453  0x02800009  0x0000.000.00000000  0x00000001   0x00000000  138984044 9    0x09    9    0x00  0x001d  0x0016  0x0000.0028a457  0x02800009  0x0000.000.00000000  0x00000001   0x00000000  138984044 9    0x0a    9    0x00  0x001c  0x0020  0x0000.0028a2e3  0x0280000a  0x0000.000.00000000  0x00000001   0x00000000  138983956 2    0x0b    9    0x00  0x001d  0xffff  0x0000.0028a4d5  0x0280000a  0x0000.000.00000000  0x00000001   0x00000000  138984076 2    0x0c    9    0x00  0x001d  0x0006  0x0000.0028a459  0x0280000a  0x0000.000.00000000  0x00000001   0x00000000  138984044 9    0x0d    9    0x00  0x001d  0x0012  0x0000.0028a495  0x0280000a  0x0000.000.00000000  0x00000001   0x00000000  138984061 2    0x0e    9    0x00  0x001c  0x0009  0x0000.0028a455  0x02800009  0x0000.000.00000000  0x00000001   0x00000000  138984044 9    0x0f    9    0x00  0x001d  0x0011  0x0000.0028a498  0x0280000a  0x0000.000.00000000  0x00000001   0x00000000  138984061 2    0x10    9    0x00  0x001d  0x0014  0x0000.0028a4c3  0x0280000a  0x0000.000.00000000  0x00000001   0x00000000  138984073 7    0x11    9    0x00  0x001d  0x0010  0x0000.0028a499  0x0280000a  0x0000.000.00000000  0x00000001   0x00000000  138984061 2    0x12    9    0x00  0x001d  0x000f  0x0000.0028a497  0x0280000a  0x0000.000.00000000  0x00000001   0x00000000  138984061 2    0x13    9    0x00  0x001d  0x0004  0x0000.0028a4d1  0x0280000a  0x0000.000.00000000  0x00000001   0x00000000  138984076 2    0x14    9    0x00  0x001d  0x0013  0x0000.0028a4c8  0x0280000a  0x0000.000.00000000  0x00000001   0x00000000  138984074 0    0x15    9    0x00  0x001c  0x0019  0x0000.0028a2f9  0x0280000a  0x0000.000.00000000  0x00000001   0x00000000  138983956 2    0x16    9    0x00  0x001a  0x000c  0x0000.0028a458  0x02800009  0x0000.000.00000000  0x00000001   0x00000000  138984044 9    0x17   10    0x80  0x001d  0x0000  0x0000.0028a4f7  0x0280000a  0x0000.000.00000000  0x00000001   0x00000000  0    0x18    9    0x00  0x001c  0x0021  0x0000.0028a3de  0x02800009  0x0000.000.00000000  0x00000001   0x00000000  138984016 1    0x19    9    0x00  0x001c  0x001c  0x0000.0028a31e  0x02800009  0x0000.000.00000000  0x00000001   0x00000000  138983966 3    0x1a    9    0x00  0x001c  0x001e  0x0000.0028a35f  0x0280000a  0x0000.000.00000000  0x00000001   0x00000000  138983984 8    0x1b    9    0x00  0x001c  0x0007  0x0000.0028a450  0x02800009  0x0000.000.00000000  0x00000001   0x00000000  138984044 9    0x1c    9    0x00  0x001c  0x001a  0x0000.0028a35e  0x02800009  0x0000.000.00000000  0x00000001   0x00000000  138983984 8    0x1d    9    0x00  0x001b  0x001b  0x0000.0028a44e  0x02800009  0x0000.000.00000000  0x00000001   0x00000000  138984044 9    0x1e    9    0x00  0x001c  0x0018  0x0000.0028a3dc  0x02800009  0x0000.000.00000000  0x00000001   0x00000000  138984016 1    0x1f    9    0x00  0x001c  0x0002  0x0000.0028a446  0x02800009  0x0000.000.00000000  0x00000001   0x00000000  138984044 9    0x20    9    0x00  0x001b  0x0015  0x0000.0028a2ee  0x0280000a  0x0000.000.00000000  0x00000001   0x00000000  138983956 2    0x21    9    0x00  0x001c  0x0000  0x0000.0028a3e0  0x02800009  0x0000.000.00000000  0x00000001   0x00000000  138984016 1 

TRN TBL::(事務表)是UNDO段頭塊最重要的。我們一一來解釋每個字段的意思:

 

index 表示事務表中槽號,只是一個序列而已,從0x00開始到0x21結束,11g的版本有34個槽。

state 表示事務狀態:9代表事務不活動,10代表事務正在活動,從這裏我們看出16進制第0x17號槽上的事務正在活動。大家有沒有發現,我們在發生事務前,Oracle會找事務控制列表中的chd=0x0017,說白了就是重從index=0x17的槽,存放當前最新的事務:

  注:下面的事務控制,是我在發生事務前(即做update gyj_test set name='GGGGG' where id=1;前所DUMP的事務控制)

   TRN CTL:: seq: 0x000d chd: 0x0017 ctl: 0x000b inc: 0x00000000 nfb:0x0001

           mgc: 0xb000 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)

           uba: 0x0280000a.000d.2b scn: 0x0000.0028a26a

cflags 表示正在使用穿上事務槽的事務的狀態:0x00表示非活動事務、0x80表示活動事務、0x10表示死事務、0x90表示被回滾的死事務

     平時我們看到的最多就是0x00表示非活動事務、0x80表示活動事務,後面的很少發生。

wrap# 表示事務表上的事務槽被重用的次數,它是XID的一部分。0x001d表示此時事務槽被重用了29次。

uel   表示當前活動事務所在事務槽的下一個事務槽的指針(即如果又發生一個新的事務,此時就會用到UEL指向的事務槽上的index)。


scn   表示務事啓動、提交、回滾的SCN.

dba   表示uba:第一部分的undo塊地址,這個DBA是(rollback)回滾的起始點,也就是說是記錄事務修改的最後一條記錄所在UNDO塊的地址。

nub   表示當前事務所用到的UNDO塊的個數。

cmt   表示最接近當前的提交時間戳,是從1970年1月1號零晨開始的(以秒爲單位記錄)。0表示事務正在活動。

 

先說到這兒,後繼會對UNDO塊格式,REDO塊格式繼續進行分析。最後通過一個事務的例子,把REDO塊、UNDO段頭塊、UNDO塊、DATA塊串起來一起分析。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章