Oracle Data block 的物理结构

本文介绍了Oracle数据库中数据块的结构,包括Cache Header、Transaction Header和Data Area三大部分,并通过一个具体的trace文件示例详细解析了各部分的具体内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.一次对block的dump过程:

PHP code:

SQL> create table t9 (a varchar(10));

Table created.

SQL> insert into t9 values('a');

1 row created.

SQL> commit;

Commit complete.

SQL> set serveroutput on
SQL> exec show_space('T9');
Free Blocks.............................1
Total Blocks............................8
Total Bytes.............................65536
Unused Blocks...........................6
Unused Bytes............................49152
Last Used Ext FileId....................3
Last Used Ext BlockId...................121
Last Used Block.........................2

PL/SQL procedure successfully completed.

SQL> alter system dump datafile 3 block 122;

System altered.

SQL> select * from v$tablespace;

TS# NAME INC
---------- ------------------------------ ---
0 SYSTEM YES
1 UNDOTBS1 YES
8 USERS YES
18 TEMP1



Trace 文件:

*** 2004-07-25 15:48:01.000Start dump data blocks tsn: 8 file#: 3 minblk 122 maxblk 122buffer tsn: 8 rdba: 0x00c0007a (3/122)scn: 0x0000.0068d716 seq: 0x01 flg: 0x02 tail: 0xd7160601frmt: 0x02 chkval: 0x0000 type: 0x06=trans dataBlock header dump: 0x00c0007aObject id on Block? Yseg/obj: 0x806d csc: 0x00.68d714 itc: 2 flg: O typ: 1 - DATAfsl: 0 fnx: 0x0 ver: 0x01Itl Xid Uba Flag Lck Scn/Fsc0x01 0x0004.00b.00000fac 0x00801885.008c.56 --U- 1 fsc 0x0000.0068d7160x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000data_block_dump,data header at 0x552105c===============tsiz: 0x1fa0hsiz: 0x14pbl: 0x0552105cbdba: 0x00c0007a76543210flag=--------ntab=1nrow=1frre=-1fsbo=0x14fseo=0x1f9bavsp=0x1f83tosp=0x1f830xe:pti[0] nrow=1 offs=00x12:pri[0] offs=0x1f9bblock_row_dump:tab 0, row 0, @0x1f9btl: 5 fb: --H-FL-- lb: 0x1 cc: 1col 0: [ 1] 61end_of_block_dumpEnd dump data blocks tsn: 8 file#: 3 minblk 122 maxblk 122

2.先介绍数据块中包括的3种头信息:

首先,数据块是通过data block buffer cache完成读和写操作的,所以它提供了20bytes的Cache Header和4bytes的 Tail给Cache,用来读取和管理。

第2部分是为Transaction层提供的Header信息。它一共占据了48bytes,包括24bytes的控制信息,和一系列的Interested Transaction Slot (ITS)。

剩下的部分都叫Data Area,用来存储用户数据。Data Area也包括data header,和row data及剩余空间。但是Cluster blocks, table blocks, index block的data header,row data结构是不相同的,这里主要介绍table blocks.

3. 结合trace文件中的信息,详细介绍:

1) The Cache Header and Tail:

buffer tsn: 8 rdba: 0x00c0007a (3/122)

scn: 0x0000.0068d716 seq: 0x01 flg: 0x02 tail: 0xd7160601

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

Database block address: 占用4 bytes,表示Tablespace relative database block address(RDBA)。包括tns=8,即Tablespace number (User 表空间),file#=3, block_id=122

SCN: 占用6bytes,表示最后变化的scn.包括2bytes的高位字节(SCN wrap),和4bytes的低位字节(SCN base)

Sequence: 占用1byte,用途不明确,可能是辅助SCN的变化

Flag: 占用1byte

Format: 占用1byte,应该是用来区分版本。Oracle 8之前值为1,之后为2.

Checksum: 占用2byte,跟db_block_checksum 参数有关系。

引用oracle document 的解释:“DB_BLOCK_CHECKSUM determines whether DBWn and the direct loader will calculate a checksum (a number calculated from all the bytes stored in the block) and store it in the cache header of every data block when writing it to disk. Checksums are verified when a block is read-only if this parameter is true and the last write of the block stored a checksum. In addition, Oracle gives every log block a checksum before writing it to the current log.

If this parameter is set to false, DBWn calculates checksums only for the SYSTEM tablespace, but not for user tablespaces.“

Block type: 占用1byte,经常用到的有,1=undo segment header block; 2=undo data block; 5= data segment header block; 6=data block

Unused: 保留的字节,占用4bytes,用来前后兼容。

Tail 包括了SCN中SCN base的低位(low-order)2bytes,然后是block type,还有Sequence number.每当block 被读的时候,都要检查Tail与 block header 是否一致,保证了这个block不是损坏的(corrupted)。

2) The Transaction Header:

一共占据48bytes,包括24bytes的控制信息,和一系列的Interested Transaction Slot (ITS)。这些ITS组合在一起称为Interested Transaction List (ITL)。初始的ITL slot 数量由 INITRANS 决定(index branch block 只有1个slot)。如果有足够的剩余空间,oracle会根据需要动态的分配这些slot,直到受到空间限制或者达到了MAXTRANS.

Block header dump: 0x00c0007aObject id on Block? Yseg/obj: 0x806d csc: 0x00.68d714 itc: 2 flg: O typ: 1 - DATAfsl: 0 fnx: 0x0 ver: 0x01Itl Xid Uba Flag Lck Scn/Fsc0x01 0x0004.00b.00000fac 0x00801885.008c.56 --U- 1 fsc 0x0000.0068d7160x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000


24bytes的控制信息包括:

Object number(seg/obj): 占用4bytes,指在OBJ$中记录的segment 的 object number(0x806d=32877)

Cleanout SCN(csc): 占用6bytes,最后一次 full cleanout 的scn

ITL count(itc): 占用1byte,ITL 的slot数量。

Flag: 占用2bytes.O表示这个block在freelist 上。否则flag为“-”

Block type: 占用1byte.1=data; 2=index

ITL freelist slot(fsl): 占用1byte.Index to the first slot on the ITL freelist

Next freelist block(fnx): 占用4byte.Segment freelist中下一个block的RDBA

Version: 1 byte

Unused: 4bytes,用来前后兼容。

每个ITL entry包括以下的内容:

Transaction id(Xid): 8bytes.其中包括rollback segment number, transaction table中的slot number等。

Undo block address(Uba): 8bytes.其中包括rollback segment block的DBA,sequence number等。

Flags: 1nibble.—— = 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

Locks: 3nibbles. 也就是所谓的行级锁(row-level locks)

SCN or free space credit: 6bytes. 如果这个事务已经clean out,这个值就是SCN;否则,前两个字节表示由这个事务释放的此block中的空间数。

3)Data Area

包括14bytes的data header,4bytes/table的table dictionary,2bytes/row的row dictionary.table dictionary主要用于cluster block中,只不过table block中的table dictionary只有一个table.

data_block_dump,data header at 0x552105c===============tsiz: 0x1fa0 ==> total data area sizehsiz: 0x14 ==> data header size (14+ntabs*4 + nrows*2)pbl: 0x0552105c ==> pointer to buffer holding the blockbdba: 0x00c0007a ==> block dba / rdba76543210flag=-------- ==> n=pctfree hit (clusters),f=don’t put on freelist, k=flushable cluster keysntab=1 ==> number of tables (>1 so this is a cluster)nrow=1 ==> number of rowsfrre=-1fsbo=0x14 ==> free space begin offsetfseo=0x1f9b ==> free space end offsetavsp=0x1f83 ==> available space in the blocktosp=0x1f83 ==> total available space when all transactions commit0xe:pti[0] nrow=1 offs=00x12:pri[0] offs=0x1f9bblock_row_dump:tab 0, row 0, @0x1f9b ==> 3bytes row header tl: 5 fb: --H-FL-- lb: 0x1 cc: 1col 0: [ 1] 61 ==> column length(1 byte if length<250; otherwise 3 bytes) and valuesend_of_block_dump

4. 对于一个没有插入任何row的block来说,并且假设使用了默认的INITRANS,它的大小应该是:

db_block_size- (cache header+ transaction header +data header + Tail + table dictionary*ntab + row dictionary*row )=8192 - ( 20+48+14+4+4 +0)=8192 - 90 =8102 bytes
Oracle数据库的数据块(Data Block)是其内部存储数据的基本单位,它是一个固定大小(通常是8KB或16KB)的连续区域。一个数据块的典型结构包括以下几个部分: 1. **头信息(Header)**:包含诸如块编号(Block ID)、分配状态(如是否已分配给表空间)、锁定信息等元数据。 2. **extent头(Extent Header)**:如果当前块位于 extent 内部,则会包含 extent 的相关信息,如 extent 的起始位置和长度。 3. **数据区(Data Area)**:存储实际的数据行。每个数据块最多存储一定数量的行,取决于列宽度、索引或其他元数据的占用情况。 4. **自由空间(Free Space)**:未被使用的空间,用于插入新行或调整记录大小。 5. **行头(Row Header)**:存储每个行的额外信息,如行的长度、删除标志等。 6. **回滚段(Rollback Segment)**:在归档模式下,为了事务恢复,会预留一部分空间用于存放事务的撤销信息。 7. **索引块(Index Blocks)**:如果是B树或其他索引结构,会包含索引键值以及指向原数据块的指针。 8. **压缩块(Compressed Blocks)**:某些Oracle版本支持压缩技术,数据块会被压缩以节省磁盘空间。 9. **特殊块(Special Blocks)**:例如控制块(Control Block)、段头块(Segment Header Block)等,用于管理特定数据库对象。 每个数据块都是数据库物理结构的重要组成部分,理解它们有助于优化查询性能、管理和维护数据库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值