DATA BLOCK内部構造

5269 ワード

blockはoracleデータベースで最も基本的なストレージ構造です.ディスク領域、セグメント、データファイルはblockで構成されています.1つのoracleデータベースのblockのサイズは、データベースが構築されたときに決定され、データベース全体の生命過程で変更できません.blockのサイズを変更するには、データベースを再構築するしかありません.
クエリー・データベース内のblockのサイズ:
SQL> select value from v$parameter where name ='db_block_size';

VALUE
--------------------------------------------------------------------------------
8192

データベース内のblockのサイズは2 k to 32 kであり、2 k、4 k、8 k、16 k、32 kの指数倍でなければならない.blockの達成可能な最大値はオペレーティングシステムによって決定される.(注:9 iでは、ユーザの表領域に異なるblockのサイズを割り当てることができます).
Oracleデータベースのマクロ的な特徴は、その内部構造、すなわちblockの構造によって決定されます.Blockの構造は私たちが想像していたよりずっと複雑だった.Blockには主にdata block,index block,undo blockがあり,この3つは異なる複雑な構造を持っている.ここで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ファイルにあります.
私のマシンではORA 02236です.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、31で格納される.「tom」は54 f 4 dで格納される.データはデータベースに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)操作をして、データブロックに何か変化があったかを見て、役に立つ情報を得ることができます.