位置: 文档库 > 数据库 > Oracle datafile block 格式说明

Oracle datafile block 格式说明

QuantumSonnet 上传于 2022-08-16 18:59

《Oracle datafile block 格式说明》

Oracle数据库作为企业级关系型数据库的代表,其数据存储的核心单元是数据文件(datafile),而数据文件的最小逻辑存储结构是数据块(data block)。理解Oracle数据块的内部格式,对于数据库性能调优、故障诊断以及底层存储机制的研究具有关键意义。本文将从Oracle数据块的基本结构、头部信息、数据存储区域、行目录、事务信息等多个维度,系统解析其物理与逻辑组成。

一、Oracle数据块的基本概念

Oracle数据块是数据库I/O操作的最小单位,也是内存缓冲区(buffer cache)中缓存的基本单元。其大小由初始化参数DB_BLOCK_SIZE决定,常见值为2KB、4KB、8KB、16KB、32KB或64KB。数据块的大小直接影响数据库的存储效率、I/O性能和内存利用率。例如,较大的数据块可减少I/O次数,但可能增加内存碎片;较小的数据块则适合高并发小事务场景。

每个数据文件由多个连续的数据块组成,而表空间(tablespace)通过数据文件映射到物理存储。数据块在逻辑上属于段(segment),段由区(extent)组成,区由连续的数据块构成。这种层级结构使得Oracle能够高效管理存储空间。

二、Oracle数据块的物理结构

Oracle数据块的物理格式可分为三个主要部分:块头部(block header)、数据区域(data area)和空闲空间(free space)。以下通过十六进制视图和偏移量分析其具体组成。

1. 块头部(Block Header)

块头部位于数据块的起始位置,包含控制信息、事务信息和行目录等关键元数据。其大小通常为84到107字节(8KB块),具体结构如下:

  • 缓存层跟踪信息(Cache Layer Tracking):占4字节,用于记录块在缓冲区缓存中的状态。
  • 块类型(Block Type):占2字节,标识块用途(如数据块、索引块、撤销块等)。
  • 事务ID(Transaction ID):占6字节,记录当前操作该块的事务信息。
  • SCN(System Change Number):占6字节,表示块最后一次修改的系统变更号,用于一致性读
  • 行目录(Row Directory):动态区域,存储行指针(rowid)和行状态信息,每行占用2字节。

通过ALTER SYSTEM DUMP DATAFILE ... BLOCK命令可查看块头部的详细信息。例如:

ALTER SYSTEM DUMP DATAFILE '/u01/oradata/ORCL/users01.dbf' BLOCK MIN 100 BLOCK MAX 100;

输出结果中,kdhbh部分显示块头部信息,ktbbh为事务表(ITL)条目,ktbfr为行目录条目。

2. 数据区域(Data Area)

数据区域是存储实际行数据的部分,其布局取决于块类型(表块、索引块等)。对于表块,数据区域包含以下内容:

  • 行数据(Row Data):每行以行头(row header)开头,包含行长度、标志位和列数信息。行头后跟随各列数据,按表定义顺序排列。
  • 迁移行(Migrated Rows):若行因更新导致长度超过可用空间,会被迁移到其他块,原位置保留转发指针(forwarding address)。
  • 链式行(Chained Rows):若单行数据过大(如LOB列),可能被拆分为多个片段存储在不同块中。

行数据的存储格式可通过DBMS_ROWID包解析。例如:

DECLARE
  v_rowid ROWID;
  v_file NUMBER;
  v_block NUMBER;
  v_row NUMBER;
BEGIN
  SELECT ROWID INTO v_rowid FROM employees WHERE employee_id = 100;
  DBMS_ROWID.ROWID_INFO(v_rowid, v_file, v_block, v_row);
  DBMS_OUTPUT.PUT_LINE('File: ' || v_file || ', Block: ' || v_block || ', Row: ' || v_row);
END;

3. 空闲空间(Free Space)

空闲空间位于数据块尾部,用于插入新行或更新现有行。其管理方式由PCTFREE和PCTUSED参数控制:

  • PCTFREE:指定块保留为更新的空闲空间百分比(默认10%)。当空闲空间低于此值时,块不再接受插入操作。
  • PCTUSED:指定块可重新用于插入的已用空间百分比(默认40%)。当已用空间低于此值时,块可再次接受插入。

空闲空间可通过DBMS_SPACE包分析。例如:

DECLARE
  v_total_blocks NUMBER;
  v_total_bytes NUMBER;
  v_unused_bytes NUMBER;
  v_used_bytes NUMBER;
  v_pct_used NUMBER;
BEGIN
  DBMS_SPACE.UNUSED_SPACE(
    segment_owner => 'HR',
    segment_name => 'EMPLOYEES',
    segment_type => 'TABLE',
    total_blocks => v_total_blocks,
    total_bytes => v_total_bytes,
    unused_bytes => v_unused_bytes,
    used_bytes => v_used_bytes,
    pct_used => v_pct_used
  );
  DBMS_OUTPUT.PUT_LINE('PCT Used: ' || v_pct_used || '%');
END;

三、Oracle数据块的关键组件

1. 事务表(ITL:Interest Transaction List)

事务表位于块头部,记录当前操作该块的事务信息。每个条目(ITL entry)包含以下字段:

  • UBA(Undo Block Address):指向撤销块的地址,用于回滚操作。
  • SCN:事务修改块的SCN。
  • 锁标志(Lock Flag):标识事务的锁类型(共享锁、排他锁等)。

ITL条目数量由初始化参数INITRANS决定(默认1或2),最大数量由MAXTRANS限制(Oracle 12c后默认255)。若ITL不足,会导致等待事件enq: TX - allocate ITL entry

2. 行目录(Row Directory)

行目录是块头部中的动态数组,存储每行的偏移量(offset)和状态标志。其结构如下:

  • 行偏移量(Row Offset):指向行数据在块中的起始位置。
  • 行标志(Row Flag):标识行状态(如已删除、迁移等)。

当行被删除时,行目录中的对应条目会被标记为删除,但空间不会立即释放,直到块重组(block cleanout)发生。

3. 块头部的SCN与一致性读

SCN是Oracle实现多版本一致性读(MVCC)的核心机制。每个数据块头部存储其最后一次修改的SCN,查询操作通过比较事务启动时的SCN与块SCN决定是否需要应用撤销数据。例如:

-- 事务1更新数据
UPDATE employees SET salary = salary * 1.1 WHERE employee_id = 100;
COMMIT;

-- 事务2在事务1提交前启动,查询时使用旧SCN
SELECT * FROM employees WHERE employee_id = 100;

若事务2的SCN早于块SCN,Oracle会从撤销段中读取旧版本数据。

四、Oracle数据块的特殊类型

1. 索引块(Index Block)

索引块的头部结构与表块类似,但数据区域存储索引条目(index entries)。每个条目包含键值(key)和对应的行地址(rowid)。索引块分为枝节点(branch block)和叶节点(leaf block):

  • 枝节点:存储键值范围和子节点指针,用于快速定位。
  • 叶节点:存储实际键值和行地址,按顺序排列以支持范围扫描。

索引块的填充因子(PCTFREE)通常设置为较高值(如40%),以减少后续插入导致的块分裂。

2. 撤销块(Undo Block)

撤销块用于存储事务修改前的数据版本,支持回滚和一致性读。其结构包含:

  • 事务表:记录活动事务信息。
  • 撤销记录:存储修改前的列值和SCN。

撤销块的空间由UNDO_RETENTION参数控制,超时后可能被覆盖。

五、Oracle数据块的性能影响

理解数据块格式对性能调优至关重要。以下场景需重点关注:

  • ITL争用:高并发事务导致ITL不足,可通过增加INITRANS或优化事务设计缓解。
  • 块分裂:索引块频繁分裂导致性能下降,可通过调整PCTFREE或重建索引解决。
  • 行迁移:更新导致行迁移,增加I/O开销,可通过增加PCTFREE或使用更大块减少。

通过AWR报告中的Buffer Busy WaitsDB Block Changes指标,可定位数据块相关的性能问题。

六、总结

Oracle数据块作为存储与I/O的核心单元,其格式设计兼顾了效率与一致性。块头部的管理信息、数据区域的行存储以及空闲空间的动态分配,共同构成了Oracle强大的存储引擎。深入理解数据块结构,不仅有助于解决实际生产中的性能问题,也为数据库设计、备份恢复和高级特性(如分区表、In-Memory)的实施提供了理论基础。

关键词:Oracle数据块、块头部、行目录、事务表、SCN、ITL、PCTFREE、一致性读、索引块、撤销块

简介:本文详细解析Oracle数据块的物理与逻辑结构,包括块头部、数据区域、空闲空间、事务表、行目录等关键组件,探讨其对性能的影响及优化方法,适用于数据库管理员和开发人员深入理解Oracle存储机制。