DATA BLOCK內部結構

sunwgneuqsoft發表於2007-12-06

blockoracle資料庫中最基本的儲存結構。盤區,段,資料檔案都是由block構成的。一個oracle資料庫中的block的大小在建立的資料庫的時候就已經決定,在整個資料庫的生命過程中不能修改;要修改block的大小隻能重建資料庫。

查詢資料庫中block的大小:

SQL> select value from v$parameter where name ='db_block_size';

VALUE

---------------------------------------------------------------------

8192

[@more@]

資料庫中block的大小從2k to 32k,而且必須是2k的指數倍,即2k4k8k16k32kblock的所能達到的最大值由作業系統決定。(注:在9i中可以為使用者的表空間分配不同的block的大小)。

Oracle資料庫宏觀上表現出來的特徵都是由其內部結構,即block的結構決定的。Block的結構原比我們想象的複雜的多。Block主要有data blockindex blockundo block,這三者有著不同的複雜結構。其中data blockindex block離我們最近,下面先看看data block的結構。

建立實驗表:

SQL> create table block_test

2 (id varchar2(4) primary key,

3 name varchar2(20))

4 tablespace test;

Table created

SQL> insert into block_test values ('0001','TOM');

1 row inserted

SQL> commit;

Commit complete

我們建立了一個資料表block_test ,並向其中插入了一條資料。想要看這個表中的資料是怎麼樣在oracle中儲存的,首先要找到這條資料庫儲存在哪個資料檔案上,哪個資料塊中。

查詢資料塊地址:

SQL> select id,name,rowid from block_test;

ID NAME ROWID

---- -------------------- ------------------

0001 TOM AAAGF2AAIAAAAnbAAA

SQL>select dbms_rowid.rowid_relative_fno('AAAGF2AAIAAAAnbAAA') file_num,

dbms_rowid.rowid_block_number('AAAGF2AAIAAAAnbAAA') block_num from dual;

file_num block_num

------------------------------ ------------------------------

8 2523

由此得知這條記錄儲存在資料中的標號為8的資料檔案的第2523個塊中。

匯出data block結構:

SQL> alter system dump datafile 8 block 2523;

System altered

data block結構資訊儲存在user_dump_dest的目錄下的日期最新的trace檔案中。

在我的機器中該檔案為ORA02236.TRC。下面對dump得到的資訊詳細說明

*** 2005-09-23 16:33:02.171

*** SESSION ID:(15.1108) 2005-09-23 16:33:02.078

Start dump data blocks tsn: 7 file#: 8 minblk 2523 maxblk 2523

buffer tsn: 7 rdba: 0x020009db (8/2523)

scn: 0x0000.24a68314 seq: 0x01 flg: 0x02 tail: 0x83140601

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

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

tsndata block所在表空間序號

file#: data block所在資料檔案序號

minblkdump的開始塊號

maxblkdump的終止塊號

rdba:資料塊地址

scnscn

seq:序列號

tail:保持一致性 lower scn + type + seq

frmt: oracle8以上為2

chkval:可選擇的校驗值

type:block的型別

Block header dump: 0x020009db

Object id on Block? Y

seg/obj: 0x6176 csc: 0x00.24a68312 itc: 1 flg: O typ: 1 - DATA

fsl: 0 fnx: 0x0 ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc

0x01 xid: 0x0004.025.000000c5 uba: 0x0080064d.00b3.13 --U- 1 fsc 0x0000.24a68314

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

seg/objseg/obj id

csc:clean scn

itc itl slots的個數,此時多少個事務在對本data block進行操作

flg: 0=on the freelist

fsl: itl tx freelist slot

fnx: dba of next block on freelist

Itlinterested transaction list index

Xidtransaction id

Ubaundo address

Flag:事務狀態標誌

Lck:事物所影響行的數量

data_block_dump

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

tsiz: 0x1fb8

hsiz: 0x14

pbl: 0x14c66c44

bdba: 0x020009db

flag=-----------

ntab=1

nrow=1

frre=-1

fsbo=0x14

fseo=0x1fac

avsp=0x1f98

tosp=0x1f98

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

0x12:pri[0] offs=0x1fac

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

tsiz: total data area size

hsiz: data header size

pbl: point to buffer holding the block

bdba: rdba

flagn=pctfree hit(clusters);f=do not put on freelist;k=flushable cluster keys

ntabnumber of tables (>1 in clusters)

nrownumber of rows

frrefirst free row index entry;-1=you have to add one

fsbofree space begin offset

fseofree space end offset

avspavailable space in the block

tosptotal available space when all txs commit

block_row_dump:

tab 0, row 0, @0x1fac

tl: 12 fb: --H-FL-- lb: 0x1 cc: 2

col 0: [ 4] 30 30 30 31 //第一列中資料長度為4,資料為30 30 30 31

col 1: [ 3] 54 4f 4d //第一列中資料長度為3,資料為54 4f 4d

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

以上資訊就是我們剛才查詢的那條記錄在資料庫中真實的儲存情況

table:記錄所在表的序號

row:記錄在塊中所在行號

tlrowsize(number of bytes plus data)

fb:記錄的狀態

lblock byteitl entry then has this row locked

cc: number of columns in this row piece

end_of_block_dump

End dump data blocks tsn: 7 file#: 8 minblk 2523 maxblk 2523

我們可以看到這條記錄在資料庫中儲存的情況。

SQL> select * from block_test;

ID NAME

---- --------------------

0001 TOM

資料‘0001’在資料庫中是以30 30 30 31來儲存的;而‘tom’則是54 4f 4d來儲存的。資料在資料庫中是以16進位制儲存的,而且和資料庫所選擇的字符集有很大的關係。可以透過以下方法來查詢資料在資料庫中的儲存形式

SQL> select id,dump(id) from block_test;

ID DUMP(ID)

--- -----------------------------------------

0001 Typ=1 Len=4: 48,48,48,49

SQL> select name,dump(name) from block_test;

NAME DUMP(NAME)

-------------------- ---------------------

TOM Typ=1 Len=3: 84,79,77

將以上資料轉化為16進位制即可得到結果。

這是data block中最基本的一些東西,我們比較感興趣的主要是最後的部分,資料在塊中具體的儲存情況。

有興趣的,可以做一些基本的dmlinsertdeleteupdate)操作,來看資料塊中發生了一些什麼變化,可以得到一些很有用的資訊。

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

相關文章