数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

数据文件internal分析


发布日期:2019年04月06日
 
数据文件internal分析

众所周知Oracle的数据是储存在数据文件中的那么Oracle是以什么格式来储存数据的呢?相信大家都对其内部结构很感兴趣这篇文章就帮大家来了解Oracle数据文件的内部结构

我们知道数据库储存的最小单位是数据块其他如extentsegmenttablespace等都是由数据块组成所以我们就从数据块的结构来分析

典型的数据块由部分构成

. 头信息区

. 这个区包括数据块的地址数据块类型检查点信息scn信息数据块版本号等(以下是其大概的构造稍后会做解释)

―――――――――――――――――――――――――――

*** ::

Start dump data blocks tsn: file#: minblk maxblk

buffer tsn: rdba: xc (/)

scn: xd seq: x flg: x tail: xd

frmt: x chkval: x type: x=trans data

Block header dump:xc

Object id on Block? Y

seg/obj: xcsc: xditc: flg: Otyp: – DATA

fsl: fnx: x ver: x

――――――――――――――――――――――――――――

.事务列表区

事务列表去包括了在这个数据块内的事务也就是我们知道的ITL(interested transaction list)从中我们可以知道XID(transaction id)UBA(undo block address)等信息(以下是其大概的构造稍后会做解释)

Itl XidUba FlagLckScn/Fsc

x xid:xuba: xcfsc x

.数据区尾区

数据区顾名思义是真正存储数据的地方在这里我们可以看到每一条记录至于尾区这里储存着数据块的版本号与数据头信息区的版本号相对应可以用来确定数据块前后是否一致

(以下是其大概的构造稍后会做解释)

―――――――――――――――――――――――――――

data_block_dump

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

tsiz: xfb

hsiz: x

pbl: xff

bdba: xc

flag=

ntab=

nrow=

frre=

fsbo=x

fseo=xfb

avsp=xfb

tosp=xfb

xe:pti[]nrow=offs=

x:pri[]offs=xfb

block_row_dump:

tab row @xfb

tl: fb: HFL lb: x cc:

col: [ ]c (数据就在这里)

end_of_block_dump

End dump data blocks tsn: file#: minblk maxblk

―――――――――――――――――――――――――――

下面我们来做一个完整的实验首先创建一个新的表空间

SQL> create tablespace testblock datafile d:\oracle\oradata\test\testblockora

size m;

表空间已创建

创建一个新用户并指定默认表空间为testblock临时表空间为temp

SQL> create user testblock identified by testblock default tablespace testblock

temporary tablespace temp;

用户已创建

SQL> grant create session to testblock;

授权成功

SQL> grant resource to testblock;

授权成功

SQL> connect testblock/testblock@test

已连接

SQL> create table testblock (a number);

表已创建

SQL> insert into testblock values();

已创建

SQL> insert into testblock values();

已创建

SQL> commit;

提交完成

SQL> connect internal/oracle@test

已连接

SQL> select header_fileheader_block from dba_segments where segment_name=TESTBLOCK;

HEADER_FILE HEADER_BLOCK

从这里我们知道testblock表所在的数据文件号是数据头块号是下面我们dump出数据块来看下

――――――――――――――――――――――――――――――――――

*** ::

*** SESSION ID:() ::

Start dump data blocks tsn: file#: minblk maxblk

buffer tsn: rdba: xc (/)

scn: xeb seq: x flg: x tail: xeb

frmt: x chkval: x type: x=DATA SEGMENT HEADER – UNLIMITED

Extent Control Header

Extent Header:: spare: space: #extents: #blocks:

last mapx#maps: offset:

Highwater::xcext#: blk#: ext size:

#blocks in seg hdrs freelists:

#blocks below:

mapblkxoffset:

Unlocked

Map Header:: nextx#extents: obj#: flag: x

Extent Map

xclength:

nfl = nfb = typ = nxf =

SEG LST:: flg: USED lhd: xc ltl: xc

End dump data blocks tsn: file#: minblk maxblk

――――――――――――――――――――――――――――――――――

这里我们看到表空间号是tsn: 数据文件号是file#: 相对数据块地址是rdba: xc (/)SCN为scn: xeb(SCN Base=SCN Wrap=eb)尾区版本号为tail: xeb(tail=SCN Wrap: eb + type: x+ seq: x)由于这个块是整个Segment的头所以它还包含整个Segment的一些存储信息比如extent数block数高水位地址 Highwater::xc自由列表信息hdrs freelists: 等等如果才用本地管理表空间则此块的存储信息通过位图方式管理

真正的数据是储存在下一个块也就是xcxc我们来看看究竟

――――――――――――――――――――――――――――――――――

*** ::

Start dump data blocks tsn: file#: minblk maxblk

buffer tsn: rdba: xc (/)

scn: xee seq: x flg: x tail: xee

frmt: x chkval: x type: x=trans data

Block header dump:xc

Object id on Block? Y

seg/obj: xbcsc: xebitc: flg: Otyp: DATA

fsl: fnx: x ver: x

Itl XidUba FlagLckScn/Fsc

x xid:xfdauba: xadaeUfsc xee

data_block_dump

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

tsiz: xfb

hsiz: x

pbl: xec

bdba: xc

flag=

ntab=

nrow=

frre=

fsbo=x

fseo=xfac

avsp=xf

tosp=xf

xe:pti[]nrow=offs=

x:pri[]offs=xfb

x:pri[]offs=xfac

block_row_dump:

tab row @xfb

tl: fb: HFL lb: x cc:

col: [ ]c

tab row @xfac

tl: fb: HFL lb: x cc:

col: [ ]c

end_of_block_dump

End dump data blocks tsn: file#: minblk maxblk

――――――――――――――――――――――――――――――――――

谜团解开了ITL数据都呈现出来了开始分析!

Block header dump:xc

Object id on Block? Y

seg/obj: xbcsc: xebitc: flg: Otyp: DATA

fsl: fnx: x ver: x

数据块地址正是xcxc

segment/object id为xb转成进制为可以由obj#表中得知

SQL> select obj# from sysobj$ where name=TESTBLOCK;

OBJ#

csc(SCN at last Block CleanOut): xeb表示最后一次块清除(Block CleanOut)时候的SCN关于块清除的概念可以查阅Thomas Kyte 着的expert one by one Oracle

itc: 表示Number of itl slots

flg: O 表示此块被放置在自由列表(freelist)中

typ: – DATA类型表示数据类型表示索引

fsl: ITL TX FREELIST SLOT

fnx: x 自由列表中下一块的地址

――――――――――――――――――――――――――――――――――

Itl XidUba FlagLckScn/Fsc

x xid:xfdauba: xadaeUfsc xee

这个事务列表中当前有一个事务里面记载着slot号事务idundo block address受影响的行数事务递交时的scn等

Itl slot =x

事务id= xid:xfda

由于xid由部分组成xid= Undo Segment Number +Transaction Table Slot Number+ Wrap 得到

x – Undo Segment Numberf – Transaction Table Slot Number da– Wrap

回滚块地址=uba: xadae

由于uba由部分组成uba= Address of the last undo block used+ Sequence+ Last Entry in UNDO record map得到

xad– Address of the last undo block usedae– Sequence – Last Entry in UNDO record map

flag标志我引用au的一段解释这里的U表示已经递交

= transaction is active or committed pending cleanout

C = transaction has been committed and locks cleaned out

B = this undo record contains the undo for this ITL entry

U = transaction committed (maybe long ago); SCN is an upper bound

T = transaction was still active at block cleanout SCN

Lck(number of rows affected by this transaction)表示这个事务所影响的行数这里是正好对应次insert

Scn/Fsc 标志我引用au的一段解释

If the transaction has been cleaned out this is the commit SCN or an upper bound thereof Otherwise the leading two bytes contain the free space credit for the transaction that is the number of bytes freed in the block by the transaction

―――――――――――――――――――――――――――――――――――――――

data_block_dump

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

tsiz: xfb

hsiz: x

pbl: xec

bdba: xc

flag=

ntab=

nrow=

frre=

fsbo=x

fseo=xfac

avsp=xf

tosp=xf

xe:pti[]nrow=offs=

x:pri[]offs=xfb

x:pri[]offs=xfac

―――――――――――――――――――――――――――――――――――――――――

这一部分记载着一些储存参数简单得分析一些给出各个标志的解释

tsiz:Total Data Area Size(数据块的大小)

hsiz:Data Header Size(数据块头大小)

pbl: ptr to buffer holding the block(指向这个数据块在内存中映象的指针)

bdba: block dba / rdba(数据块地址)

flag: n=pctfree hit (clusters)f=dont put on freelist k=flushable cluster keys

ntab: number of tables (> is a cluster)

nrow: number of rows

frre: first free row index entry =you have to add one(没有创建索引)

fsbo: free space begin offset(从hsiz开始)

fseo: free space end offset()

avsp: available space in the block(可用空间)

tosp: total available space when all txs commit

xe:pti[]nrow=offs=本块储存条记录

x:pri[]offs=xfb 记录的起始物理位置

―――――――――――――――――――――――――――――――――――――――――

终于见到到数据了这个部分就存储着对应的记录继续分析

block_row_dump:

tab row @xfb

tl: fb: HFL lb: x cc:

ol: [ ]c

tab row @xfac

tl: fb: HFL lb: x cc:

col: [ ]c

end_of_block_dump

End dump data blocks tsn: file#: minblk maxblk

―――――――――――――――――――――――――――――――――――――――

tl表示Row Size(number of bytes plus data)

fb:Flag Byte

Hhead of row piece

Ffirst data piece

Llast data piece

Lb表示lock byte表示这个事务在itl的入口

Cc表示number of columns in this Row piece表示这一行只有

col: [ ]c 第一列[]表示长度c 是数据(经过一套复杂的过程可以转换成进制数据)

到此为止数据块的结构我们已经都把它展开并进行了分析期待大家的继续!

               

上一篇:Oracle数据库空间管理和规划

下一篇:ORACLE的TO