CLUSTER內部結構的總結(3)

litterbaby發表於2007-06-04
CLUSTER內部結構的總結(3)[@more@]

將這個塊dump出來,這部分是資料塊的頭:

Start dump data blocks tsn: 18 file#: 5 minblk 12 maxblk 12

buffer tsn: 18 rdba: 0x0140000c (5/12)

scn: 0x0000.00318001 seq: 0x01 flg: 0x02 tail: 0x80010601

frmt: 0x02 chkval: 0x0000 type: 0x06=trans data

Hex dump of block: st=0, typ_found=1

這部分是ITL,這裡需要注意的是在9i之前資料的ITL最小是1,在Oracle 10g之後預設的最小是2。但是在9i時候custerITL的最小是2

Block header dump: 0x0140000c

Object id on Block? Y

seg/obj: 0xcbcb csc: 0x00.318000 itc: 2 flg: E typ: 1 - DATA

brn: 0 bdba: 0x1400009 ver: 0x01 opc: 0

inc: 0 exflg: 0

Itl Xid Uba Flag Lck Scn/Fsc

0x01 0x0006.020.00000479 0x00800017.012b.09 C--- 0 scn 0x0000.00318000

0x02 0x0002.004.00000479 0x0080041b.02cf.14 --U- 8 fsc 0x0000.00318001

開始看正題了:

data_block_dump,data header at 0x8222264

===============

tsiz: 0x1f98

hsiz: 0x32

pbl: 0x08222264

bdba: 0x0140000c

76543210

flag=-------K

ntab=3

nrow=12

frre=-1

fsbo=0x32

fseo=0x1ef4

avsp=0x1ec2

tosp=0x1ec2

這裡面與其他的不一樣的是flag的標誌。

flag=----N-K-F-AN:

No inserts (pctfree hit, clusters only)

K: Flushable Key(s)

F: Do not put block on free list

A: Array style hash cluster only

還有ntab,這裡表示這個資料塊中存放的是三個表的資料,其實在這個表存放的是一個cluster和兩個表的資料。

nrow標識的是這三個表的總共的行數。

0xe:pti[0] nrow=4 offs=0

0x12:pti[1] nrow=4 offs=4

0x16:pti[2] nrow=4 offs=8

這三個需要解釋一個這個是和普通的堆表存放不一樣的地方。這個一般存放在資料部分的0x0e這個位置開始,按照offs(兩個位元組),rows(兩個位元組)的順序排列,以上的排列應該是這樣的:

-- -- -- --

Offs rows

00 00 04 00

04 00 04 00

08 00 04 00

這就是告訴Oracle,第一個表有四行,從00開始偏移,其實這個表就是cluster本身。

然後是第二個表也是有四行,從04開始偏移,。

第三個表四行,從08開始偏移。

我們們再做一個試驗,檢驗一下這個結論的正確像:

SQL> insert into t1 values ('1','t1aaa');――t1表插入一個數值

1 row inserted

SQL> commit;

Commit complete

SQL> alter system checkpoint;

System altered

SQL> alter system dump datafile 5 block 12;

System altered

SQL>

可以在dump上看到:

0xe:pti[0] nrow=4 offs=0

0x12:pti[1] nrow=5 offs=4 ――t1

0x16:pti[2] nrow=4 offs=9

這時候可以看到我們的猜測是正確的。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/222350/viewspace-917323/,如需轉載,請註明出處,否則將追究法律責任。

相關文章