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/4K | OLTP |
| 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 调整
| 场景 | PCTFREE | PCTUSED |
|---|---|---|
| OLTP 频繁更新 | 高(30-40) | 低(40-50) |
| 仓库只读 | 低(5-10) | 高(80-90) |
| 默认 | 10 | 40 |
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;
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. 最佳实践
- 块大小选择:场景
- PCTFREE 调整:更新模式
- ASSM:自动
- LMT:现代
- 监控行迁移:性能
- SHRINK HWM:空间
- ITL 足够:并发
- RMAN 块恢复:损坏
- 块转储:诊断
- 文档化:配置
17. 参考资料
[1] Oracle Database Concepts 19c, “Data Blocks” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/logical-storage-structures.html