SQL> connect test/test@test 已连接。 SQL> create table test (a number); 表已创建。 SQL> insert into test values(1); 已创建 1 行。
SQL> select segment_name,header_file,header_block from dba_segments where segmen t_name like 'TEST'; SEGMENT_NAME HEADER_FILE HEADER_BLOCK TEST 1 35387 SQL> alter system dump datafile 1 block 35388; 系统已更改。 DUMP出数据头文件查看itl(interested transaction list) *** 2003-06-09 18:41:19.359 Start dump data blocks tsn: 0 file#: 1 minblk 35388 maxblk 35388 buffer tsn: 0 rdba: 0x00408a3c (1/35388) scn: 0x0000.00105cd3 seq: 0x04 flg: 0x00 tail: 0x5cd30604 frmt: 0x02 chkval: 0x0000 type: 0x06=trans data Block header dump: 0x00408a3c Object id on Block? Y seg/obj: 0x6487 csc: 0x00.105cd2 itc: 1 flg: O typ: 1 - DATA fsl: 0 fnx: 0x0 ver: 0x01 Itl Xid Uba Flag Lck Scn/Fsc 0x01 xid: 0x0008.000.00000002 uba: 0x00800dc4.0000.05 ---- 1 fsc 0x001c.00000000 /*这里可以看到xid= 0x0008.000.00000002(事务id) uba= 0x00800dc4.0000.05(undo block address) lck= 1(受影响的行数) 根据Xid的结构得到 0x0008.000.00000002 0x0008 – Undo Segment Number 000 – Transaction Table Slot Number 00000002– Wrap 根据uba的结构得到 0x00800dc4.0000.05 0x00800dc4– Address of the last undo block used 0000 – Sequence 05 – Last Entry in UNDO record map */ data_block_dump =============== 以下省略。。。。。。 根据 0x0008 – Undo Segment Number, SQL> select a.segment_name,a.header_file,a.header_block from dba_segments a,dba _rollback_segs b where a.segment_name=b.segment_name and b.segment_id='8'; SEGMENT_NAME HEADER_FILE HEADER_BLOCK RBS7 2 3522 然后dump rbs头查看trans table Start dump data blocks tsn: 1 file#: 2 minblk 3522 maxblk 3522 buffer tsn: 1 rdba: 0x00800dc2 (2/3522) scn: 0x0000.00105cd2 seq: 0x01 flg: 0x00 tail: 0x5cd20e01 frmt: 0x02 chkval: 0x0000 type: 0x0e=KTU UNDO HEADER W/UNLIMITED EXTENTS Extent Control Header ----------------------------------------------------------------- Extent Header:: spare1: 0 space2: 0 #extents: 8 #blocks: 511 last map 0x00000000 #maps: 0 offset: 4128 Highwater:: 0x00800dc4 ext#: 0 blk#: 1 ext size: 63 #blocks in seg. hdr's freelists: 0 #blocks below: 0 mapblk 0x00000000 offset: 0 Unlocked Map Header:: next 0x00000000 #extents: 8 obj#: 0 flag: 0x40000000 Extent Map ----------------------------------------------------------------- 0x00800dc3 length: 63 0x00800d42 length: 64 0x00800582 length: 64 0x00800342 length: 64 0x00800482 length: 64 0x008017c2 length: 64 0x00801802 length: 64 0x00800c42 length: 64 TRN CTL:: seq: 0x0000 chd: 0x0001 ctl: 0x0061 inc: 0x00000000 nfb: 0x0000 mgc: 0x8002 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe) uba: 0x00800dc4.0000.01 scn: 0x0000.00000000 Version: 0x01 FREE BLOCK POOL:: uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0 uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0 uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0 uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0 uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0 TRN TBL:: index state cflags wrap# uel scn dba parent-xid nub ------------------------------------------------------------------------------------------------ 0x00 10 0x80 0x0002 0x0000 0x0000.00105cd2 0x00800dc4 0x0000.000.00000000 0x00000001 0x01 9 0x00 0x0001 0x0002 0x0000.00000000 0x00000000 0x0000.000.00000000 0x00000000 以下省略。
。。。。。。 根据从xid中得到的000 – Transaction Table Slot Number 去找到事务表中记载的undo块的地址dba=0x00800dc4(也可从uba中直接得到) 接下来我们来看一下undo头的地址rdba: 0x00800dc2 (2/3522) 所以我们去dump 3524即undo头+2 *** 2003-06-09 18:42:52.734 Start dump data blocks tsn: 1 file#: 2 minblk 3524 maxblk 3524 buffer tsn: 1 rdba: 0x00800dc4 (2/3524) scn: 0x0000.00105cd3 seq: 0x04 flg: 0x00 tail: 0x5cd30204 frmt: 0x02 chkval: 0x0000 type: 0x02=KTU UNDO BLOCK ******************************************************************************** UNDO BLK: xid: 0x0008.000.00000002 seq: 0x0 cnt: 0x5 irb: 0x5 icl: 0x0 flg: 0x0000 Rec Offset Rec Offset Rec Offset Rec Offset Rec Offset --------------------------------------------------------------------------- 0x01 0x1f80 0x02 0x1f18 0x03 0x1eb0 0x04 0x1e48 0x05 0x1de0 *----------------------------- * Rec #0x1 slt: 0x00 objn: 25735(0x00006487) objd: 25735 tblspc: 0(0x00000000) * Layer: 11 (Row) opc: 1 rci 0x00 Undo type: Regular undo Begin trans Last buffer split: No Temp Object: No Tablespace Undo: No rdba: 0x00000000 *----------------------------- uba: 0x00000000.0000.00 ctl max scn: 0x0000.00000000 prv tx scn: 0x0000.00000000 KDO undo record: KTB Redo op: 0x04 ver: 0x01 op: L itl: scn: 0x0004.049.000000d8 uba: 0x00800716.009f.3a flg: C-U- lkc: 0 scn: 0x0000.00105ccf KDO Op code: DRP xtype: XA bdba: 0x00408a3c hdba: 0x00408a3b itli: 1 ispac: 0 maxfr: 4863 tabn: 0 slot: 1(0x1) 根据KDO Op code: DRP,表明反操作是delete,所以我们可以知道这就是刚才insert后在undo segment里记载的信息 我们知道当发生insert的时候undo segment里仅记载了记录的rowid,下面我们把它找出来 SQL> select rowid from test; ROWID ------------------ AAAGSHAABAAAIo8AAC Translate the value: AAAGSHAABAAAIo8AAC Data Object number = AAAGSH File = AAB Block = AAAIo8 ROW = AAC 然后根据公式转换 得到data object number=25735 file=1 block=35388 row=2
|