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
分享到:
相关推荐
### Data Block 物理结构详解 #### 一、Data Block 物理结构概述 在 Oracle 数据库中,数据块(Data Block)是最基本的数据存储单位。一个数据块通常包含了一系列的记录,这些记录用于存储数据库表中的数据。理解...
### Oracle的逻辑结构、物理结构与实例 #### 一、Oracle的逻辑结构 Oracle数据库的逻辑结构是一种层次化的组织方式,主要包括以下组成部分: 1. **数据块(Data Blocks)** - **定义**:数据块是Oracle数据库中...
Oracle数据库的逻辑结构与物理结构是理解其工作原理的关键部分。在Oracle数据库中,数据的组织和存储方式有助于高效的数据管理、存储和检索。 第四章主要涵盖了以下几个知识点: 1. **逻辑结构**: - **表空间...
Oracle数据库是世界上最流行的商业关系型数据库管理系统之一,其复杂性和高效性主要体现在其逻辑结构、物理结构和实例的巧妙设计上。本篇文章将深入探讨Oracle的这三个关键组成部分。 首先,Oracle的逻辑结构是用户...
Oracle 体系结构是指 Oracle 数据库管理系统的总体架构,它由逻辑结构、物理结构和实例三部分组成。下面将详细介绍每个部分的组成和关系。 一、逻辑结构 逻辑结构是 Oracle 体系结构的最高级别,它是面向用户的,...
- 控制文件(*.ctl):这是一个二进制文件,记录了数据库的物理结构信息,对于数据库的正常启动至关重要。可以使用v$controlfile数据字典视图查询控制文件的详细信息。 - 日志文件(*.log):也称为重做日志文件,...
1. **Oracle数据格式**:理解Oracle数据库的数据存储结构,包括数据块、行链接、块内数据组织等。这涉及到Oracle的物理存储机制,如ROWIDs(行标识符)和块头信息。 2. **数据读取**:源代码可能包含使用Oracle的低...
### Oracle实验二:体系结构、存储结构与各类参数 #### 实验目的 1. **理解Oracle体系结构**:包括逻辑组件如表空间、段、区等;物理组件如数据文件、控制文件、重做日志文件等。 2. **了解初始化参数文件以及初始...
7. **数据块(Data Blocks)**:数据块是Oracle数据库的最小存储单位,大小由初始化参数DB_BLOCK_SIZE定义。数据块内存储数据行和相关的数据字典信息。 8. **内存管理**:Oracle采用自动内存管理机制,包括SGA的...
2. **物理结构**:描述了数据是如何存储在物理介质上的。 - **OS Block**:操作系统块是操作系统用来读取磁盘的基本单位。 - **Datafile**:数据文件是数据库存储数据的主要物理文件。 #### 三、示例:Scott用户...
Schema 是用户创建对象的组织方式,逻辑结构是 Oracle 内部管理数据库中对象的方式,物理结构是 OS block 到 datafile 的物理存储方式。逻辑结构包括 database、tablespace、segment、extent 和 block。 Oracle 表...
控制文件是数据库的关键组件,记录了数据库的物理结构信息,包括数据文件和日志文件的位置。如果要查看控制文件的信息,可以查询`v$controlfile`视图。例如,通过`SELECT name FROM v$controlfile;`可以获取控制文件...
Oracle数据库中的存储结构可以分为逻辑结构和物理结构两大部分。逻辑结构主要包括数据库、表空间、段、区段和Oracle数据块,而物理结构则主要指操作系统层面的数据文件和数据块。下面是这些结构之间的关系概述: - ...
Oracle数据库的体系结构是其高效运行的基础,涵盖了物理结构、逻辑结构、内存结构以及进程等多个层面。理解这些组件的工作方式对于管理和优化Oracle数据库至关重要。 首先,我们来看Oracle数据库的物理结构。物理...
首先,Oracle数据库的物理结构由构成数据库的操作系统文件决定。主要包括以下几类文件: 1. 数据文件(Data File):存储数据库中的所有数据,如表数据和索引数据。通常以`.dbf`格式存在。 2. 日志文件(Redo Log ...
4. **数据块(Oracle Block)**:数据块是Oracle数据库的最小逻辑存储单元,它由操作系统块(OS Block)组成,但通常比OS块小,以优化I/O性能。数据块中包含数据行和其他数据库管理信息。 5. **扩展区(Extent)**...
Oracle 9i作为一个成熟的数据库管理系统,其体系结构涵盖了逻辑结构、物理结构以及应用架构等多个方面。 首先,从逻辑结构上看,Oracle 9i主要由表空间、段、区间和数据块组成。表空间(TableSpace)是数据库数据的...