Chinaunix首页 | 论坛 | 博客
  • 博客访问: 86269
  • 博文数量: 42
  • 博客积分: 905
  • 博客等级: 准尉
  • 技术积分: 400
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-14 14:08
文章分类

全部博文(42)

文章存档

2015年(1)

2011年(41)

我的朋友

分类: Oracle

2011-05-31 11:43:56

首先创建一张表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会自己完成。
阅读(1330) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~