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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PostgreSQL DBA(17) - XLOG Record data內部結構SQL
- 淺析Block的內部結構 , 及分析其是如何利用 NSInvocation 進行呼叫BloC
- Redis 內部資料結構Redis資料結構
- 【REDO】Oracle redo內部結構Oracle Redo
- Kafak探究之路- 內部結構小結
- Redis 字串 內部資料結構Redis字串資料結構
- Redis 物件內部組織結構 —— 字典Redis物件
- FPGA內部硬體結構簡介FPGA
- gdb golang 檢視iface 內部結構Golang
- 區塊鏈(Block Chain)結構解析區塊鏈BloCAI
- redis 資料結構和內部編碼Redis資料結構
- Java HashMap原理及內部儲存結構JavaHashMap
- PostgreSQL DBA(16) - WAL segment file內部結構SQL
- 放大器內部結構原理圖解圖解
- 資料庫內部儲存結構探索資料庫
- 探索Kafka消費者的內部結構Kafka
- Redis資料結構的內部編碼Redis資料結構
- Redis內部資料結構詳解(4)——ziplistRedis資料結構
- 【Redis】內部資料結構自頂向下梳理Redis資料結構
- 利用泛型模擬棧結構實現內部鏈式儲存結構泛型
- 位元組碼檔案的內部結構之謎
- 見微知著 —— Redis 字串精緻的內部結構Redis字串
- (三分鐘系列)詳解Redis字串內部結構Redis字串
- 見微知著——Redis字串內部結構原始碼分析Redis字串原始碼
- 32. DDR2記憶體內部結構-1記憶體
- 理清 Block 底層結構及其捕獲行為BloC
- 見縫插針 —— 深入 Redis HyperLogLog 內部資料結構分析Redis資料結構
- 這高階玩意的的內部結構你瞭解多少
- CNN、RNN、DNN的內部網路結構有什麼區別?CNNRNNDNN
- 自學C day03-CPU內部結構和暫存器
- 2_深入解析Oracle ASSM結構之Level 2 Bitmap BlockOracleSSMBloC
- 隨筆:sending data狀態包含了使用內部臨時表
- ANA:內部機構持續崛起
- 架構團隊如何重構內部系統架構
- 每天一個 PHP 語法六陣列使用及內部結構PHP陣列
- 什麼是非結構化資料(unstructured data)?Struct
- 比特幣原始碼研讀(2)資料結構-區塊Block比特幣原始碼資料結構BloC
- 每天一個 PHP 語法二字串使用及內部結構PHP字串
- 以位元組跳動內部 Data Catalog 架構升級為例聊業務系統的效能優化架構優化