Oracle 数据块结构深度

Oracle 数据块结构深度

适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Oracle 数据块是最小 I/O 单位[1]:

结构

  • 块头
  • 表目录
  • 行目录
  • 行数据
  • 空闲空间

详细见:Oracle 数据块结构


2. 块大小

2.1 标准

- 默认 8K
- 2K / 4K / 8K / 16K / 32K
- db_block_size 参数

2.2 非标准

-- 多块大小
ALTER SYSTEM SET db_16k_cache_size = 1G;

CREATE TABLESPACE ts_16k BLOCKSIZE 16K;

2.3 选择

大小适用
2K/4KOLTP
8K通用
16K/32K数据仓库

3. 块结构

3.1 块头

- 块类型
- 块地址
- SCN
- ITL(Interested Transaction List)
- 块校验

3.2 表目录

- 块所属表
- 多表共享块(Cluster)

3.3 行目录

- 行位置
- 行长度
- 行状态

3.4 行数据

- 列数据
- 行头
- 列长度

3.5 空闲空间

- 未使用空间
- 增长预留

4. ITL(Interested Transaction List)

4.1 作用

- 事务锁信息
- 块上未提交事务
- 一致性读

4.2 配置

CREATE TABLE t (...) 
  INITRANS 10 
  MAXTRANS 255;

4.3 等待

- ITL 满 → 行锁等待
- ORA-00054(资源忙)

详细见:Oracle 事务与锁机制


5. PCTFREE / PCTUSED

5.1 PCTFREE

CREATE TABLE t (...) PCTFREE 20;
-- 预留 20% 给 UPDATE

5.2 PCTUSED

CREATE TABLE t (...) PCTUSED 40;
-- 低于 40% 才能再插入

5.3 调整

场景PCTFREEPCTUSED
OLTP 频繁更新高(30-40)低(40-50)
仓库只读低(5-10)高(80-90)
默认1040

6. 行迁移

6.1 原因

- UPDATE 行变长
- 块空间不足
- 行迁到新块
- ROWID 不变
- 增加 I/O

6.2 检测

ANALYZE TABLE t COMPUTE STATISTICS;

SELECT 
  table_name, 
  chain_cnt,
  ROUND(chain_cnt / num_rows * 100, 2) AS pct_chained
FROM user_tables
WHERE chain_cnt > 0;

6.3 处理

-- 1. 增大 PCTFREE
ALTER TABLE t PCTFREE 30;

-- 2. 重建
ALTER TABLE t MOVE;

-- 3. 导入导出
expdp/impdp

7. 行链接

7.1 原因

- 行大于块大小
- LONG / LOB
- 多块链接

7.2 处理

- 增大块大小
- 表空间 16K / 32K
- LOB 独立段

8. HWM(High Water Mark)

8.1 概念

- 表使用过的最大块
- 全表扫描到 HWM
- DELETE 不降低

8.2 查看

SELECT 
  blocks, 
  empty_blocks, 
  num_rows
FROM user_tables
WHERE table_name = 'T';

8.3 降低

-- 10g+
ALTER TABLE t SHRINK SPACE;

-- 或
ALTER TABLE t MOVE;

详细见:Oracle 高水位线 HWM 详解


9. Extent 分配

9.1 类型

- Dictionary Managed(旧)
- Locally Managed(LMT)
  - Uniform
  - Autoallocate

9.2 LMT

CREATE TABLESPACE ts 
  DATAFILE '/u01/oradata/ts01.dbf' SIZE 100M
  EXTENT MANAGEMENT LOCAL AUTOALLOCATE
  SEGMENT SPACE MANAGEMENT AUTO;

9.3 Uniform

CREATE TABLESPACE ts 
  DATAFILE '...' SIZE 100M
  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

10. Segment

10.1 类型

  • Table
  • Index
  • Cluster
  • Lob
  • LobIndex
  • Temporary
  • Rollback/Undo

10.2 管理

-- 自动
SEGMENT SPACE MANAGEMENT AUTO

-- 手动(旧)
FREELIST

11. ASSM(Automatic Segment Space Management)

11.1 特性

- 位图管理空闲
- 替代 FREELIST
- 减少热点
- 自动

11.2 启用

CREATE TABLESPACE ts 
  DATAFILE '...' 
  SEGMENT SPACE MANAGEMENT AUTO;

12. 块转储

12.1 转储

ALTER SYSTEM DUMP DATAFILE 1 BLOCK 100;

12.2 查看

# trace 文件
$ORACLE_BASE/diag/rdbms/.../trace/

12.3 内容

- 块头
- ITL
- 行数据
- 校验

13. 块恢复

13.1 RMAN

RMAN> BLOCKRECOVER DATAFILE 1 BLOCK 100, 101;
RMAN> BLOCKRECOVER CORRUPTION LIST;

13.2 V$DATABASE_BLOCK_CORRUPTION

SELECT * FROM v$database_block_corruption;

详细见:Oracle DBMS_REPAIR 修复损坏块


14. 监控

14.1 链行

SELECT name, value FROM v$sysstat 
WHERE name LIKE 'table fetch%continued row%';

14.2 块等待

SELECT event, total_waits, time_waited
FROM v$system_event
WHERE event LIKE 'buffer busy%' OR event LIKE 'read%';

14.3 I/O

SELECT 
  phyrds, phywrts, phyblkrd, phyblkwrt
FROM v$filestat;

15. 常见坑与排错

15.1 ORA-01578

- 块损坏
- RMAN 恢复
- DBMS_REPAIR

15.2 行迁移多

- 增大 PCTFREE
- 重建表
- SHRINK

15.3 HWM 高

- SHRINK
- MOVE
- 在线重定义

16. 最佳实践

  1. 块大小选择:场景
  2. PCTFREE 调整:更新模式
  3. ASSM:自动
  4. LMT:现代
  5. 监控行迁移:性能
  6. SHRINK HWM:空间
  7. ITL 足够:并发
  8. RMAN 块恢复:损坏
  9. 块转储:诊断
  10. 文档化:配置

17. 参考资料

[1] Oracle Database Concepts 19c, “Data Blocks” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/logical-storage-structures.html