下面我对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.
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=0