ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle 块分析

oracle 块分析

原创 Linux操作系统 作者:jinyuhuahan 时间:2009-05-07 16:05:24 0 删除 编辑

ORACLE 块的分析
(一)
一直以来对“块”的概念总是含混不清,从字面意义理解,只知道这是ORACLE
存放数据的最小单位,然而它的内部世界如何呢,本人打算从今天开始连载几篇
文档,对它进行深度分析。
通过很多文档、资料,了解到了数据库基本结构鱼刺图:

 

据文件存放在块设备上,在实际的生产环境中,大部分情况都是将数据库安装在
裸设备(RAW)也叫做原始分区之上。关于RAW 将在以后进行讲解。
通过上面这段文字,我们可以了解到ORACLE 基本的存储结构,下一篇将针对块
的大小与存放数据大小来做实验。
(二)
上一节了解到了ORACLE 的存储结构,这节讲一讲块的大小与数据存放之间的关
系。
大家都知道了在ORACLE 环境中,所有的对象都是存放在块中,这个块大小与存
放的记录之间到底存在怎样的关系呢?
做一个实验看看:
数据库中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 ffs=0
0x12:pri[0] ffs=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:numberof 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/14870673/viewspace-594441/,如需转载,请注明出处,否则将追究法律责任。

上一篇: oracle临时表
下一篇: oracle 碎片整理
请登录后发表评论 登录
全部评论

注册时间:2009-03-17

  • 博文量
    19
  • 访问量
    24999