oracle undo段頭的深度分析
產生一個事物
update set num=00 where id=1
查看事物信息,可以發現事物用的是3號段
select xid,xidusn,xidslot,xidsqn,ubablk,ubafil from v$transaction;
XID XIDUSN XIDSLOT XIDSQN UBABLK UBAFIL
---------------- ---------- ---------- ---------- ---------- ----------
01001E0007050000 3 30 1287 1566 3
回滾段的段頭塊
select * from v$rollname;
USN NAME
---------- ------------------------------
0 SYSTEM
1 _SYSSMU1_3780397527$
2 _SYSSMU2_2232571081$
3 _SYSSMU3_2097677531$
4 _SYSSMU4_1152005954$
5 _SYSSMU5_1527469038$
6 _SYSSMU6_2443381498$
7 _SYSSMU7_3286610060$
8 _SYSSMU8_2012382730$
9 _SYSSMU9_1424341975$
10 _SYSSMU10_3550978943$
查看3號回滾段的段頭id 和塊號
select header_block,header_file from dba_segments where segment_name='_SYSSMU3_2097677531$';
HEADER_BLOCK HEADER_FILE
------------ -----------
160 3
轉儲回滾段頭 查看當前會話的進程編號
alter system dump undo header '_SYSSMU3_2097677531$';
select spid from v$process where addr in (select paddr from v$session where sid=(select sid from v$mystat where rownum=1));
SPID
------------------------
38380
spid//server process ID 38380
查看trace的名稱
select * from v$diag_info where name='Default Trace File';
INST_ID NAME VALUE
---------- ---------------------------------------------------------------- --------------------------------------------------------------------------------
1 Default Trace File /u01/app/oracle/diag/rdbms/hyyk/hyyk/trace/hyyk_ora_38380.trc
查看trace的文件,接下來一塊一塊分析
less /u01/app/oracle/diag/rdbms/hyyk/hyyk/trace/hyyk_ora_38380.trc
第一部分
********************************************************************************
Undo Segment: _SYSSMU3_2097677531$ (3)
********************************************************************************
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 4 #blocks: 271
last map 0x00000000 #maps: 0 offset: 4080
Highwater:: 0x00c00da8 ext#: 3 blk#: 40 ext size: 128
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 3
Unlocked
Map Header:: next 0x00000000 #extents: 4 obj#: 0 flag: 0x40000000
#extents: 4 表示3號UNDO段有4個區
#blocks: 271 表示3號UNDO回滾段兩個區中有271個UNDO BLOCK可用。(如下下面的sql語句 8+8+128+128=272 為什么不是272個UNDO BLOCK塊呢,因為去掉一個UNDO段頭塊)
ext#: 3 表示這個事務發生在第2個區(從0開始)
blk#: 30 表示這個事務發生在第2個區的第30個塊上。
ext size: 128 表示第2個區上有128個UNDO BLOCK可用
通過dba_extents視圖查出一共有4個區,共271個塊
select extent_id,file_id,block_id,blocks,bytes from dba_extents where segment_name='_SYSSMU3_2097677531$';
EXTENT_ID FILE_ID BLOCK_ID BLOCKS BYTES
---------- ---------- ---------- ---------- ----------
0 3 160 8 65536
1 3 344 8 65536
2 3 1024 128 1048576
3 3 3456 128 1048576
通過dba_segments視圖查出UNDO段頭塊,即3號文件的160號塊是UNDO段頭塊 如上面的語句的第一行結果 0 3 160 8 65536
select header_file,header_block from dba_segments where segment_name='_SYSSMU3_2097677531$';
HEADER_FILE HEADER_BLOCK
----------- ------------
3 160
第二部分
Extent Map
-----------------------------------------------------------------
0x00c00081 length: 7
0x00c00088 length: 8
0x00c00280 length: 128
0x00c00600 length: 128
3號UNDO回滾段的區地圖一共有4個區:
第一個區對應的是3號文件161號塊、162號塊、163號塊、164號塊、165號塊、166號塊、167號塊,共7個UNDO BLOCK
第二個區對應的是3號文件344號塊、10號塊、11號塊、12號塊、13號塊、14號塊、15號塊,16號塊,共8個UNDO BLOCK
第三個區對應的是3號文件1024號塊...
第三部分
Retention Table
-----------------------------------------------------------
Extent Number:0 Commit Time: 1524377480
Extent Number:1 Commit Time: 1524377480
Extent Number:2 Commit Time: 1524384037
Extent Number:3 Commit Time: 1524384037
區的提交時間戳,是從1970年1月1號零晨開始的(以秒為單位記錄)
第四部分
TRN CTL:: seq: 0x0197 chd: 0x0000 ctl: 0x0013 inc: 0x00000000 nfb: 0x0000
mgc: 0xb000 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)
uba: 0x00c00da8.0197.2f scn: 0x0000.00201605
seq: 0x0197 表示此事務修改前的值所在的UNDOBLOCK塊被覆蓋了407次,與下面的uba: uba: 0x00c00da8.0197.2f中的0197對應。
chd:0x0000 表示發生一個新的事務,此時會在下面的TRNTBL::(事務表)的index=0x0000槽中放入新事務信息,即事務表的鏈頭或叫入口。
ctl: 0x0013 表示事務表的鏈尾(實際上大家可以去TRN TBL::看index= 0x0013(0x013),它對應的SCN=0x0000.00201b8b是本事務表中最大的SCN,即此事務槽最后才會被覆蓋)
nfb: 0x0000 表示UNDO塊在空閑池的空閑塊數,0x0000表示池中沒有空閑UNDO塊了,即FREE BLOCKPOOL::沒空閑的塊了。
flg: 0x0001 表示該塊的用途,1=KTUUNDO HEADER(2=KTU UNDO BLOCK等等)
uba: 0x00c00da8.0197.2f 表示新事務的第一條UNDO記錄(由三部分組成undo塊的地址、UNDO塊被重用的次數、在UNDO塊的第幾條記錄)
undo塊的地址: 0x00c00da8 即3號文件的160號塊
UNDO塊被重用的次數: 0197 即UNDO塊被覆蓋了407次
在UNDO塊的第幾條記錄 2f 即在UNDO塊的第36條
0x0000.00201605 表示3號UNDO段頭塊中最小的提交的SCN。實際上這個SCN就是事務表中最小的SCN所對應的事務槽上的SCN
第5部分
FREE BLOCK POOL::
uba: 0x00000000.0197.2e ext: 0x3 spc: 0xc46
uba: 0x00000000.0197.02 ext: 0x3 spc: 0x1f06
uba: 0x00000000.0197.0b ext: 0x3 spc: 0x15c0
uba: 0x00000000.0091.38 ext: 0x10 spc: 0x546
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
UNDO塊的空閑池,當事務做了提交會把此事務所在的UNDO塊加入空閑池中。
uba: 由三部分組成undo塊的地址、UNDO塊被重用的次數、在UNDO塊的第幾條記錄,當undo塊的地址為0說明UNDO塊不是空閑的,即0x00000000
ext: UNDO塊是在哪個區(extent)
spc: UNDO塊中多少空閑空間,單位字節
第六部分
TRN TBL::
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
-------------------------------------------------------------------------------------------------------------------------------------------------
0x00 9 0x00 0x05ba 0x0008 0x0000.00201611 0x00c00da5 0x0000.000.00000000 0x00000001 0x00000000 1524399079
0x01 9 0x00 0x05ba 0x000a 0x0000.00201b14 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399864
0x02 9 0x00 0x05b8 0x0001 0x0000.00201af3 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399845
0x03 9 0x00 0x05b9 0x0018 0x0000.002016dc 0x00c00da5 0x0000.000.00000000 0x00000001 0x00000000 1524399201
0x04 9 0x00 0x05bb 0x0009 0x0000.002018a8 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399442
0x05 9 0x00 0x05ba 0x001e 0x0000.00201832 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399382
0x06 9 0x00 0x05bc 0x0016 0x0000.00201879 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399409
0x07 9 0x00 0x05ba 0x001c 0x0000.00201964 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399570
0x08 9 0x00 0x05ba 0x0011 0x0000.0020161f 0x00c00da5 0x0000.000.00000000 0x00000001 0x00000000 1524399079
0x09 9 0x00 0x05bb 0x000b 0x0000.002018e0 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399479
0x0a 9 0x00 0x05bb 0x0013 0x0000.00201b39 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399875
0x0b 9 0x00 0x05ba 0x001b 0x0000.00201914 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399510
0x0c 9 0x00 0x05ba 0x001f 0x0000.0020177e 0x00c00da6 0x0000.000.00000000 0x00000001 0x00000000 1524399305
0x0d 9 0x00 0x05bb 0x0006 0x0000.00201864 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399387
0x0e 9 0x00 0x05ba 0x0003 0x0000.002016b7 0x00c00da5 0x0000.000.00000000 0x00000001 0x00000000 1524399173
0x0f 10 0x80 0x05bc 0x0003 0x0000.00201b98 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 0
0x10 9 0x00 0x05bc 0x0017 0x0000.00201731 0x00c00da6 0x0000.000.00000000 0x00000001 0x00000000 1524399262
0x11 9 0x00 0x05b9 0x0021 0x0000.00201623 0x00c00da5 0x0000.000.00000000 0x00000001 0x00000000 1524399079
0x12 9 0x00 0x05bb 0x0015 0x0000.00201a68 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399753
0x13 9 0x00 0x05bb 0xffff 0x0000.00201b8b 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399936
0x14 9 0x00 0x05b9 0x000e 0x0000.0020169c 0x00c00da5 0x0000.000.00000000 0x00000001 0x00000000 1524399143
0x15 9 0x00 0x05ba 0x0002 0x0000.00201a9d 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399783
0x16 9 0x00 0x05bb 0x0004 0x0000.0020188f 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399419
0x17 9 0x00 0x05ba 0x000c 0x0000.00201750 0x00c00da6 0x0000.000.00000000 0x00000001 0x00000000 1524399266
0x18 9 0x00 0x05b9 0x0010 0x0000.0020170e 0x00c00da6 0x0000.000.00000000 0x00000001 0x00000000 1524399235
0x19 9 0x00 0x05ba 0x0012 0x0000.00201a39 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399722
0x1a 9 0x00 0x05b9 0x0005 0x0000.0020182b 0x00c00da8 0x0000.000.00000000 0x00000002 0x00000000 1524399382
0x1b 9 0x00 0x05ba 0x0007 0x0000.00201936 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399540
0x1c 9 0x00 0x05ba 0x001d 0x0000.0020198a 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399600
0x1d 9 0x00 0x05ba 0x0019 0x0000.00201a01 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399683
0x1e 9 0x00 0x05bb 0x000d 0x0000.00201849 0x00c00da8 0x0000.000.00000000 0x00000001 0x00000000 1524399382
0x1f 9 0x00 0x05bb 0x0020 0x0000.002017b2 0x00c00da6 0x0000.000.00000000 0x00000001 0x00000000 1524399327
0x20 9 0x00 0x05ba 0x001a 0x0000.002017f8 0x00c00da6 0x0000.000.00000000 0x00000001 0x00000000 1524399378
0x21 9 0x00 0x05b9 0x0014 0x0000.0020162f 0x00c00da5 0x0000.000.00000000 0x00000001 0x00000000 1524399081
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表示事務正在活動。