首先创建一张表test1 create table test1 (id number(10),info1 char(2000),info2 char(2000));
插入一行 insert into test1 values(1,'aaa','bbb'); commit;
select rowid from test1; ------ ROWID AAAQniAAFAAAG/zAAA
从rowid得到该数据块在datafile 5,block 28659中。
alter system dump datafile 5 block 28659;
----------------- tsiz: 0x1f98 hsiz: 0x14 pbl: 0x0d317c64 bdba: 0x01406ff3 76543210 flag=-------- ntab=1 nrow=1 frre=-1 fsbo=0x14 fseo=0xfec avsp=0xfd8 tosp=0xfd8 0xe:pti[0] nrow=1 offs=0 0x12:pri[0] offs=0xfec block_row_dump: tab 0, row 0, @0xfec tl: 4012 fb: --H-FL-- lb: 0x1 cc: 3 col 0: [ 2] c1 02 col 1: [2000] 61 61 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 省略。。。 col 2: [2000] 62 62 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 省略。。。 -----------------
这时我增加一列: alter table test1 add lraw long raw; 并且更新lraw为字节数9000的字符串。 重新dump alter system dump datafile 5 block 28659; ------------------------------ tsiz: 0x1f98 hsiz: 0x14 pbl: 0x0d317c64 bdba: 0x01406ff3 76543210 flag=-------- ntab=1 nrow=1 frre=-1 fsbo=0x14 fseo=0xbbc avsp=0xba8 tosp=0xba8 0xe:pti[0] nrow=1 offs=0 0x12:pri[0] offs=0xbbc block_row_dump: tab 0, row 0, @0xbbc tl: 5084 fb: --H-F--N lb: 0x2 cc: 4 nrid: 0x01406ff5.0 col 0: [ 2] c1 02 col 1: [2000] 61 61 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 省略。。。 col 2: [2000] 62 62 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 省略。。。 col 3: [1063] 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 省略。。。 ------------------------------ 可以看到产生了row chaining,有nrid: 0x01406ff5.0,说明有另外一部分数据在数据文件5,数据块28661中(从bdba可以直接得出数据在哪个文件的哪个块中,0x140是数据文件号乘以64,0x6ff5是数据块号。)
dump另一部分的数据 alter system dump datafile 5 block 28661. ------------------------------- tsiz: 0x1f80 hsiz: 0x14 pbl: 0x0d317c7c bdba: 0x01406ff5 76543210 flag=-------- ntab=1 nrow=1 frre=-1 fsbo=0x14 fseo=0x79 avsp=0x65 tosp=0x65 0xe:pti[0] nrow=1 offs=0 0x12:pri[0] offs=0x79 block_row_dump: tab 0, row 0, @0x79 tl: 7943 fb: -----LP- lb: 0x1 cc: 1 col 0: [7937] 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 省略。。。 -------------------------------
然后删除刚加的那一列 alter table test1 drop column lraw;
再次dump数据文件 ------------------------tsiz: 0x1f98 hsiz: 0x14 pbl: 0x0d317c64 bdba: 0x01406ff3 76543210 flag=-------- ntab=1 nrow=1 frre=-1 fsbo=0x14 fseo=0xbbc avsp=0xba8 tosp=0xfd8 0xe:pti[0] nrow=1 offs=0 0x12:pri[0] offs=0xbbc block_row_dump: tab 0, row 0, @0xbbc tl: 4012 fb: --H-FL-- lb: 0x1 cc: 3 col 0: [ 2] c1 02 col 1: [2000] 61 61 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 省略。。。 col 2: [2000] 62 62 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 省略。。。 ----------------------------------
和第一次dump出来的是一致的。
所以推测redo信息里会有去掉nrid的信息。 REDO RECORD - Thread:1 RBA: 0x00034e.0000000c.01d8 LEN: 0x2058 VLD: 0x01 SCN: 0x0000.0106632d SUBSCN: 3 05/31/2011 12:07:07 CHANGE #1 TYP:0 CLS:33 AFN:2 DBA:0x00800089 OBJ:4294967295 SCN:0x0000.0106632d SEQ: 1 OP:5.2 ktudh redo: slt: 0x0008 sqn: 0x00000000 flg: 0x000a siz: 8036 fbi: 232 uba: 0x0080099b.0e3f.01 pxid: 0x0000.000.00000000 CHANGE #2 TYP:1 CLS:34 AFN:2 DBA:0x0080099b OBJ:4294967295 SCN:0x0000.0106632d SEQ: 1 OP:5.1 ktudb redo: siz: 8036 spc: 1116 flg: 0x000a seq: 0x0e3f rec: 0x01 xid: 0x0009.008.000025c4 ktubu redo: slt: 8 rci: 0 opc: 11.1 objn: 68066 objd: 68066 tsn: 6 Undo type: Regular undo Undo type: Last buffer split: No Tablespace Undo: No 0x00800999 KDO undo record: KTB Redo op: 0x03 ver: 0x01 op: Z KDO Op code: IRP row dependencies Disabled xtype: XA flags: 0x00000000 bdba: 0x01406ff5 hdba: 0x01406feb itli: 2 ispac: 0 maxfr: 4858 tabn: 0 slot: 0(0x0) size/delt: 7943 fb: -----LP- lb: 0x0 cc: 1 null: - col 0: [7937] 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 省略。。。 CHANGE #3 TYP:2 CLS: 1 AFN:5 DBA:0x01406ff5 OBJ:68066 SCN:0x0000.01065a64 SEQ: 1 OP:11.3 KTB Redo op: 0x11 ver: 0x01 op: F xid: 0x0009.008.000025c4 uba: 0x0080099b.0e3f.01 Block cleanout record, scn: 0x0000.0106632d ver: 0x01 opt: 0x02, entries follow... itli: 1 flg: 2 scn: 0x0000.01065a64 KDO Op code: DRP row dependencies Disabled xtype: XA flags: 0x00000000 bdba: 0x01406ff5 hdba: 0x01406feb itli: 2 ispac: 0 maxfr: 4858 tabn: 0 slot: 0(0x0)
REDO RECORD - Thread:1 RBA: 0x00034e.0000001d.0184 LEN: 0x00e8 VLD: 0x01 SCN: 0x0000.0106632d SUBSCN: 5 05/31/2011 12:07:07 CHANGE #1 TYP:0 CLS:34 AFN:2 DBA:0x0080099b OBJ:4294967295 SCN:0x0000.0106632d SEQ: 2 OP:5.1 ktudb redo: siz: 80 spc: 112 flg: 0x0022 seq: 0x0e3f rec: 0x02 xid: 0x0009.008.000025c4 ktubu redo: slt: 8 rci: 1 opc: 11.1 objn: 68066 objd: 68066 tsn: 6 Undo type: Regular undo Undo type: Last buffer split: No Tablespace Undo: No 0x00000000 KDO undo record: KTB Redo op: 0x02 ver: 0x01 op: C uba: 0x00800999.0e3f.1d KDO Op code: CFA row dependencies Disabled xtype: XA flags: 0x00000000 bdba: 0x01406ff3 hdba: 0x01406feb itli: 1 ispac: 0 maxfr: 4858 tabn: 0 slot: 0(0x0) flag: 0x00 lock: 1 nrid: 0x01406ff5.0 CHANGE #2 TYP:0 CLS: 1 AFN:5 DBA:0x01406ff3 OBJ:68066 SCN:0x0000.0106632d SEQ: 1 OP:11.8 KTB Redo op: 0x02 ver: 0x01 op: C uba: 0x0080099b.0e3f.02 KDO Op code: CFA row dependencies Disabled xtype: XA flags: 0x00000000 bdba: 0x01406ff3 hdba: 0x01406feb itli: 1 ispac: 0 maxfr: 4858 tabn: 0 slot: 0(0x0) flag: 0x02 lock: 1 nrid: 0x03000000.ffffc258
11.3先删除bdba: 0x01406ff5的数据,11.8把dba: 0x01406ff3的nrid指向0x03000000.ffffc258。0x03000000.ffffc258应该是个不存在的dba。
其实对于解析sql语句来说,这部分是不需要解析出来的。只需解析出drop column的语句。其他oracle会自己完成。 |