分享
 
 
 

数据文件internal分析

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

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

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

典型的数据块由3部分构成:

1. 头信息区

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

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

*** 2003-06-10 10:05:10.296

Start dump data blocks tsn: 2 file#: 3 minblk 13107 maxblk 13107

buffer tsn: 2 rdba: 0x00c03333 (3/13107)

scn: 0x0000.00105d22 seq: 0x05 flg: 0x00 tail: 0x5d220605

frmt: 0x02 chkval: 0x0000 type: 0x06=trans data

Block header dump: 0x00c03333

Object id on Block? Y

seg/obj: 0x6493 csc: 0x00.105d22 itc: 1 flg: O typ: 1 – DATA

fsl: 0 fnx: 0x0 ver: 0x01

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

2. 事务列表区

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

Itl Xid Uba Flag Lck Scn/Fsc

0x01 xid: 0x0009.012.00000002 uba: 0x00800c84.0000.25 ---- 1 fsc 0x0000.00000000

3. 数据区,尾区

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

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

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

data_block_dump

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

tsiz: 0x1fb8

hsiz: 0x14

pbl: 0x0f3f7444

bdba: 0x00c03333

flag=-----------

ntab=1

nrow=1

frre=-1

fsbo=0x14

fseo=0x1fb2

avsp=0x1f9b

tosp=0x1f9b

0xe:pti[0] nrow=1 offs=0

0x12:pri[0] offs=0x1fb2

block_row_dump:

tab 0, row 0, @0x1fb2

tl: 6 fb: --H-FL-- lb: 0x1 cc: 1

col 0: [ 2] c1 02(数据就在这里)

end_of_block_dump

End dump data blocks tsn: 2 file#: 3 minblk 13107 maxblk 13107

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

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

SQL> create tablespace testblock datafile 'd:\oracle\oradata\test\testblock.ora'

size 100m;

表空间已创建。

创建一个新用户并指定默认表空间为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(1);

已创建 1 行。

SQL> insert into testblock values(2);

已创建 1 行。

SQL> commit;

提交完成。

SQL> connect internal/oracle@test

已连接。

SQL> select header_file,header_block from dba_segments where segment_name='TESTBLOCK';

HEADER_FILE HEADER_BLOCK

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

11 2

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

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

*** 2003-06-12 11:36:22.437

*** SESSION ID:(12.96) 2003-06-12 11:36:22.343

Start dump data blocks tsn: 8 file#: 11 minblk 2 maxblk 2

buffer tsn: 8 rdba: 0x02c00002 (11/2)

scn: 0x0000.001148eb seq: 0x01 flg: 0x00 tail: 0x48eb1001

frmt: 0x02 chkval: 0x0000 type: 0x10=DATA SEGMENT HEADER – UNLIMITED

Extent Control Header

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

Extent Header:: spare1: 0 space2: 0 #extents: 1 #blocks: 4

last map 0x00000000 #maps: 0 offset: 4128

Highwater:: 0x02c00004 ext#: 0 blk#: 1 ext size: 4

#blocks in seg. hdr's freelists: 1

#blocks below: 1

mapblk 0x00000000 offset: 0

Unlocked

Map Header:: next 0x00000000 #extents: 1 obj#: 25755 flag: 0x40000000

Extent Map

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

0x02c00003 length: 4

nfl = 1, nfb = 1 typ = 1 nxf = 0

SEG LST:: flg: USED lhd: 0x02c00003 ltl: 0x02c00003

End dump data blocks tsn: 8 file#: 11 minblk 2 maxblk 2

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

这里我们看到表空间号是tsn: 8,数据文件号是file#: 11,相对数据块地址是rdba: 0x02c00002 (11/2),SCN为scn: 0x0000.001148eb(SCN Base=0011,SCN Wrap=48eb),尾区版本号为tail: 0x48eb1001(tail=SCN Wrap: 48eb + type: 0x10+ seq: 0x01),由于这个块是整个Segment的头,所以它还包含整个Segment的一些存储信息,比如extent数,block数,高水位地址 Highwater:: 0x02c00004,自由列表信息hdr's freelists: 1等等。假如才用本地治理表空间,则此块的存储信息通过位图方式治理。

真正的数据是储存在下一个块也就是0x02c00002+1=0x02c00003,我们来看看究竟。

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

*** 2003-06-12 12:00:41.781

Start dump data blocks tsn: 8 file#: 11 minblk 3 maxblk 3

buffer tsn: 8 rdba: 0x02c00003 (11/3)

scn: 0x0000.001148ee seq: 0x01 flg: 0x02 tail: 0x48ee0601

frmt: 0x02 chkval: 0x0000 type: 0x06=trans data

Block header dump: 0x02c00003

Object id on Block? Y

seg/obj: 0x649b csc: 0x00.1148eb itc: 1 flg: O typ: 1 - DATA

fsl: 0 fnx: 0x0 ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc

0x01 xid: 0x0006.03f.000000da uba: 0x00800ad2.00ae.04 --U- 2 fsc 0x0000.001148ee

data_block_dump

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

tsiz: 0x1fb8

hsiz: 0x16

pbl: 0x0ec77444

bdba: 0x02c00003

flag=-----------

ntab=1

nrow=2

frre=-1

fsbo=0x16

fseo=0x1fac

avsp=0x1f90

tosp=0x1f90

0xe:pti[0] nrow=2 offs=0

0x12:pri[0] offs=0x1fb2

0x14:pri[1] offs=0x1fac

block_row_dump:

tab 0, row 0, @0x1fb2

tl: 6 fb: --H-FL-- lb: 0x1 cc: 1

col 0: [ 2] c1 02

tab 0, row 1, @0x1fac

tl: 6 fb: --H-FL-- lb: 0x1 cc: 1

col 0: [ 2] c1 03

end_of_block_dump

End dump data blocks tsn: 8 file#: 11 minblk 3 maxblk 3

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

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

Block header dump: 0x02c00003

Object id on Block? Y

seg/obj: 0x649b csc: 0x00.1148eb itc: 1 flg: O typ: 1 - DATA

fsl: 0 fnx: 0x0 ver: 0x01

数据块地址正是0x02c00002+1=0x02c00003

segment/object id为0x649b,转成10进制为25755,可以由obj#表中得知

SQL> select obj# from sys.obj$ where name='TESTBLOCK';

OBJ#

----------

25755

csc(SCN at last Block CleanOut): 0x00.1148eb表示最后一次块清除(Block CleanOut)时候的SCN,关于块清除的概念可以查阅Thomas Kyte 著的”eXPert one by one Oracle”。

itc: 1 表示Number of itl slots

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

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

fsl: 0 ITL TX FREELIST SLOT

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

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

Itl Xid Uba Flag Lck Scn/Fsc

0x01 xid: 0x0006.03f.000000da uba: 0x00800ad2.00ae.04 --U- 2 fsc 0x0000.001148ee

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

Itl slot =0x01

事务id= xid: 0x0006.03f.000000da

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

0x0006 – Undo Segment Number 03f – Transaction Table Slot Number 000000da– Wrap

回滚块地址=uba: 0x00800ad2.00ae.04

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

0x00800ad2– Address of the last undo block used 00ae– Sequence 04– Last Entry in UNDO record map

flag标志我引用www.ixora.com.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)表示这个事务所影响的行数,这里是2行,正好对应2次insert

Scn/Fsc 标志我引用www.ixora.com.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: 0x1fb8

hsiz: 0x16

pbl: 0x0ec77444

bdba: 0x02c00003

flag=-----------

ntab=1

nrow=2

frre=-1

fsbo=0x16

fseo=0x1fac

avsp=0x1f90

tosp=0x1f90

0xe:pti[0] nrow=2 offs=0

0x12:pri[0] offs=0x1fb2

0x14:pri[1] offs=0x1fac

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

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

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 (>1 is a cluster)

nrow: number of rows

frre: first free row index entry, -1=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

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

0x12:pri[0] offs=0x1fb2---- 记录的起始物理位置

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

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

block_row_dump:

tab 0, row 0, @0x1fb2

tl: 6 fb: --H-FL-- lb: 0x1 cc: 1

ol 0: [ 2] c1 02

tab 0, row 1, @0x1fac

tl: 6 fb: --H-FL-- lb: 0x1 cc: 1

col 0: [ 2] c1 03

end_of_block_dump

End dump data blocks tsn: 8 file#: 11 minblk 3 maxblk 3

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

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

fb:Flag Byte

H-head of row piece

F-first data piece

L-last data piece

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

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

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有