DATA BLOCK内部结构

block是oracle数据库中最基本的存储结构。盘区,段,数据文件都是由block构成的。一个oracle数据库中的block的大小在建立的数据库的时候就已经决定,在整个数据库的生命过程中不能修改;要修改block的大小只能重建数据库。

查询数据库中block的大小:

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

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

数据库中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)操作,来看数据块中发生了一些什么变化,可以得到一些很有用的信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值