ITPub博客

首页 > 数据库 > Oracle > DATA BLOCK内部结构

DATA BLOCK内部结构

原创 Oracle 作者:sunwgneuqsoft 时间:2007-12-06 22:03:39 0 删除 编辑

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

查询数据库中block的大小:

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

VALUE

---------------------------------------------------------------------

8192

[@more@]

数据库中block的大小从2k to 32k,而且必须是2k的指数倍,即2k4k8k16k32kblock的所能达到的最大值由操作系统决定。(注:在9i中可以为用户的表空间分配不同的block的大小)。

Oracle数据库宏观上表现出来的特征都是由其内部结构,即block的结构决定的。Block的结构原比我们想象的复杂的多。Block主要有data blockindex blockundo block,这三者有着不同的复杂结构。其中data blockindex 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

======================================

tsndata block所在表空间序号

file#: data block所在数据文件序号

minblkdump的开始块号

maxblkdump的终止块号

rdba:数据块地址

scnscn

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/objseg/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

Itlinterested transaction list index

Xidtransaction id

Ubaundo 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

flagn=pctfree hit(clusters);f=do not put on freelist;k=flushable cluster keys

ntabnumber of tables (>1 in clusters)

nrownumber of rows

frrefirst free row index entry;-1=you have to add one

fsbofree space begin offset

fseofree space end offset

avspavailable space in the block

tosptotal 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:记录在块中所在行号

tlrowsize(number of bytes plus data)

fb:记录的状态

lblock byteitl 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中最基本的一些东西,我们比较感兴趣的主要是最后的部分,数据在块中具体的存储情况。

有兴趣的,可以做一些基本的dmlinsertdeleteupdate)操作,来看数据块中发生了一些什么变化,可以得到一些很有用的信息。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8394333/viewspace-989115/,如需转载,请注明出处,否则将追究法律责任。

下一篇: oracle的两个bug
请登录后发表评论 登录
全部评论
  • 博文量
    56
  • 访问量
    759842