发表于: 2008.07.03 23:35
分类: ORACLE
出处: http://yangtingkun.itpub.net/post/468/465678
---------------------------------------------------------------
如果一条记录的长度超过了BLOCK_SIZE,Oracle会以行链接的形式来存放,不过Oracle到底是如何实现行链接的,一直没有深究,直到有一个网友问起这个问题。
说明行迁移对应的标识位。
行链接在存储结构上是如何实现的(一):http://yangtingkun.itpub.net/post/468/465165
行链接在存储结构上是如何实现的(二):http://yangtingkun.itpub.net/post/468/465376
行链接在存储结构上是如何实现的(三):http://yangtingkun.itpub.net/post/468/465482
行链接在存储结构上是如何实现的(四):http://yangtingkun.itpub.net/post/468/465569
上一篇文章中确定了行记录的标识,不过似乎H标识和F标识如影随形,不好确定二者的区别。不过相信Oracle没有必要用两个标识来表示同一条记录,因此可以肯定,二者表示的含义并不相同。
既然,PN是用来标识行链接的,那么这个H和F是否和行迁移有关呢,下面构造一个行迁移的情况。
首先看一下T4的DUMP情况:
Start dump data blocks tsn: 27 file#: 28 minblk 50 maxblk 50
buffer tsn: 27 rdba: 0x07000032 (28/50)
scn: 0x0001.c489e644 seq: 0x06 flg: 0x04 tail: 0xe6440606
frmt: 0x02 chkval: 0x7bcc type: 0x06=trans data
Block header dump: 0x07000032
Object id on Block? Y
seg/obj: 0x
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x
0x02 0x0000.000.00000000 0x0000
data_block_dump,data header at 0xad7cc
===============
tsiz: 0x1fa0
hsiz: 0x16
pbl: 0x0ad7cc
bdba: 0x07000032
76543210
flag=--------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x
avsp=0x6dc
tosp=0x6dc
0xe:pti[0] nrow=2 offs=0
0x12:pri[0] offs=0x1e6e
0x14:pri[1] offs=0x
block_row_dump:
tab 0, row 0, @0x1e6e
tl: 306 fb: --H-FL-- lb: 0x1 cc: 3
col 0: [100]
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
col 1: [100]
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
col 2: [100]
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
tab 0, row 1, @0x
tl: 6012 fb: --H-FL-- lb: 0x1 cc: 3
col 0: [2000]
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
.
.
.
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
col 1: [2000]
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
.
.
.
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
col 2: [2000]
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
.
.
.
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
end_of_block_dump
End dump data blocks tsn: 27 file#: 28 minblk 50 maxblk 50
更新T4表的第一条记录,使得第一条记录的长度超过当前BLOCK的空闲空间,从而造成行迁移,并对当前BLOCK进行dump:
SQL> select rownum, rowid from t4;
ROWNUM ROWID
---------- ------------------
1 AAAJqbAAcAAAAAyAAA
2 AAAJqbAAcAAAAAyAAB
SQL> update t4 set col1 = lpad('1', 4000, '1') where rowid = 'AAAJqbAAcAAAAAyAAA';
已更新 1 行。
SQL> alter system checkpoint;
系统已更改。
SQL> alter system dump datafile 28 block 50;
系统已更改。
检查现在的DUMP结果:
Start dump data blocks tsn: 27 file#: 28 minblk 50 maxblk 50
buffer tsn: 27 rdba: 0x07000032 (28/50)
scn: 0x0001.c489e8b0 seq: 0x02 flg: 0x04 tail: 0xe8b00602
frmt: 0x02 chkval: 0x1732 type: 0x06=trans data
Block header dump: 0x07000032
Object id on Block? Y
seg/obj: 0x
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x
0x02 0x0000.000.00000000 0x0000
data_block_dump,data header at 0xad7cc
===============
tsiz: 0x1fa0
hsiz: 0x16
pbl: 0x0ad7cc
bdba: 0x07000032
76543210
flag=--------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x
avsp=0x6dc
tosp=0x805
0xe:pti[0] nrow=2 offs=0
0x12:pri[0] offs=0x1e6e
0x14:pri[1] offs=0x
block_row_dump:
tab 0, row 0, @0x1e6e
tl: 9 fb: --H----- lb: 0x1 cc: 0
nrid: 0x07000033.0
tab 0, row 1, @0x
tl: 6012 fb: --H-FL-- lb: 0x1 cc: 3
col 0: [2000]
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
.
.
.
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
col 1: [2000]
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
.
.
.
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
col 2: [2000]
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
.
.
.
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
end_of_block_dump
End dump data blocks tsn: 27 file#: 28 minblk 50 maxblk 50
观察红色部分,行迁移已经产生,而且标识位发生了变化,仅为一个H,继续DUMP行迁移后的BLOCK:
SQL> alter system dump datafile 28 block 51;
系统已更改。
对应的TRACE文件:
Start dump data blocks tsn: 27 file#: 28 minblk 51 maxblk 51
buffer tsn: 27 rdba: 0x07000033 (28/51)
scn: 0x0001.c489e8b0 seq: 0x05 flg: 0x04 tail: 0xe8b00605
frmt: 0x02 chkval: 0x063b type: 0x06=trans data
Block header dump: 0x07000033
Object id on Block? Y
seg/obj: 0x
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x
0x02 0x0000.000.00000000 0x0000
0x03 0x0000.000.00000000 0x0000
data_block_dump,data header at 0xad7cc74
===============
tsiz: 0x
hsiz: 0x14
pbl: 0x0ad7cc74
bdba: 0x07000033
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xf12
avsp=0xefe
tosp=0xefe
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0xf12
block_row_dump:
tab 0, row 0, @0xf12
tl: 4214 fb: ----FL-- lb: 0x1 cc: 3
hrid: 0x07000032.0
col 0: [4000]
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
.
.
.
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
col 1: [100]
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
col 2: [100]
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
end_of_block_dump
End dump data blocks tsn: 27 file#: 28 minblk 51 maxblk 51
对于行迁移的数据所在BLOCK,标识中会包含F,如上面红色部分显示。
现在已经可以确定,H标识的是记录的头信息,即使记录本身可能并没有保存在这里。而F标识的是记录开始,怀疑这里是FRIST的含义。











