yangtingkun
===========================================================
行链接在存储结构上是如何实现的(五)
===========================================================

如果一条记录的长度超过了BLOCK_SIZEOracle会以行链接的形式来存放,不过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是用来标识行链接的,那么这个HF是否和行迁移有关呢,下面构造一个行迁移的情况。

首先看一下T4DUMP情况:

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: 0x9a9b csc: 0x01.c489e644 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0004.00c.000185a0 0x00976be3.1cff.11 ---- 2 fsc 0x0000.00000000
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000

data_block_dump,data header at 0xad7cc5c
===============
tsiz: 0x1fa0
hsiz: 0x16
pbl: 0x0ad7cc5c
bdba: 0x07000032
76543210
flag=--------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x6f2
avsp=0x6dc
tosp=0x6dc
0xe:pti[0] nrow=2 offs=0
0x12:pri[0] offs=0x1e6e
0x14:pri[1] offs=0x6f2
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, @0x6f2
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: 0x9a9b csc: 0x01.c489e644 itc: 2 flg: - typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0004.00c.000185a0 0x00976be3.1cff.13 ---- 2 fsc 0x0129.00000000
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000

data_block_dump,data header at 0xad7cc5c
===============
tsiz: 0x1fa0
hsiz: 0x16
pbl: 0x0ad7cc5c
bdba: 0x07000032
76543210
flag=--------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x6f2
avsp=0x6dc
tosp=0x805
0xe:pti[0] nrow=2 offs=0
0x12:pri[0] offs=0x1e6e
0x14:pri[1] offs=0x6f2
block_row_dump:
tab 0, row 0, @0x1e6e
tl: 9 fb: --H----- lb: 0x1 cc: 0
nrid: 0x07000033.0
tab 0, row 1, @0x6f2
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: 0x9a9b csc: 0x01.c489e8b0 itc: 3 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0004.00c.000185a0 0x00976be3.1cff.12 ---- 1 fsc 0x0000.00000000
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000

data_block_dump,data header at 0xad7cc74
===============
tsiz: 0x1f88
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的含义。

yangtingkun 发表于:2008.07.03 23:35 ::分类: ( ORACLE ) ::阅读:(410次) :: 评论 (0)

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)

 authimage


切换风格
新闻聚合
博客日历
文章归档...
最新发表...
最新评论...
最多阅读文章...
最多评论文章...
博客统计...
Blog信息
网站链接...