DATA BLOCK內部結構
block是oracle資料庫中最基本的儲存結構。盤區,段,資料檔案都是由block構成的。一個oracle資料庫中的block的大小在建立的資料庫的時候就已經決定,在整個資料庫的生命過程中不能修改;要修改block的大小隻能重建資料庫。
查詢資料庫中block的大小:
SQL> select value from v$parameter where name ='db_block_size';
VALUE
---------------------------------------------------------------------
8192
[@more@]資料庫中block的大小從2k to 32k,而且必須是2k的指數倍,即2k,4k,8k,16k,32k。block的所能達到的最大值由作業系統決定。(注:在9i中可以為使用者的表空間分配不同的block的大小)。
Oracle資料庫宏觀上表現出來的特徵都是由其內部結構,即block的結構決定的。Block的結構原比我們想象的複雜的多。Block主要有data block,index block,undo block,這三者有著不同的複雜結構。其中data block和index 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
======================================
tsn:data block所在表空間序號
file#: data block所在資料檔案序號
minblk:dump的開始塊號
maxblk:dump的終止塊號
rdba:資料塊地址
scn:scn號
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/obj:seg/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
Itl:interested transaction list index
Xid:transaction id
Uba:undo 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
flag:n=pctfree hit(clusters);f=do not put on freelist;k=flushable cluster keys
ntab:number of tables (>1 in clusters)
nrow:number of rows
frre:first free row index entry;-1=you have to add one
fsbo:free space begin offset
fseo:free space end offset
avsp:available space in the block
tosp:total 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:記錄在塊中所在行號
tl:rowsize(number of bytes plus data)
fb:記錄的狀態
lb:lock byte—itl 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中最基本的一些東西,我們比較感興趣的主要是最後的部分,資料在塊中具體的儲存情況。
有興趣的,可以做一些基本的dml(insert,delete,update)操作,來看資料塊中發生了一些什麼變化,可以得到一些很有用的資訊。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8394333/viewspace-989115/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DATA BLOCK內部結構圖BloC
- 原創:oracle data block 內部結構分析OracleBloC
- Data block 內部結構的解析(轉載gyj_hobby的文章)BloC
- RMAN備份效率之-oracle block internal(block 內部結構分解)OracleBloC
- Oracle Data block 的物理結構OracleBloC
- oracle資料檔案內部BLOCK結構詳解OracleBloC
- PostgreSQL DBA(17) - XLOG Record data內部結構SQL
- Oracle Data block 的物理結構-體系架構OracleBloC架構
- LoadRunner內部結構
- 索引內部結構探索索引
- undo 事物內部結構
- 淺析Block的內部結構 , 及分析其是如何利用 NSInvocation 進行呼叫BloC
- Redis 內部資料結構Redis資料結構
- 【REDO】Oracle redo內部結構Oracle Redo
- MySQL-InnoDB內部結構MySql
- zt_data block資料塊之物理結構初識BloC
- Kafak探究之路- 內部結構小結
- CLUSTER內部結構的總結(1)
- CLUSTER內部結構的總結(2)
- CLUSTER內部結構的總結(3)
- CLUSTER內部結構的總結(4)
- Export data from a data blockExportBloC
- Redis 字串 內部資料結構Redis字串資料結構
- 【原創】MySQLProxy-內部結構MySql
- zt_undo 事物內部結構
- date型別的內部結構型別
- 深入理解Cassandra內部結構
- B樹索引的內部結構索引
- iOS 揭露Block的內部實現原理iOSBloC
- FPGA內部硬體結構簡介FPGA
- Redis 物件內部組織結構 —— 字典Redis物件
- gdb golang 檢視iface 內部結構Golang
- Java虛擬機器內部結構Java虛擬機
- 資料塊內部結構dump解析
- 放大器內部結構原理圖解圖解
- 資料庫內部儲存結構探索資料庫
- Java HashMap原理及內部儲存結構JavaHashMap
- redis 資料結構和內部編碼Redis資料結構