Oracle 架构深度解析
深入理解 Oracle 内存结构、进程模型、存储结构
最后更新: 2026-04-15
页面目录
第二章:Oracle 架构深度解析
文档信息
- 适用版本:Oracle 12c / 18c / 19c / 21c
- 阅读时间:约 45 分钟
- 前置知识:第一章内容
2.1 内存结构详解
2.1.1 SGA 组件深度剖析
┌─────────────────────────────────────────────────────────────┐
│ SGA 内存分布图 │
├─────────────────────────────────────────────────────────────┤
│ Fixed SGA (固定区) │
│ ├── 数据库实例状态信息 │
│ └── 进程间通信信息 │
├─────────────────────────────────────────────────────────────┤
│ Variable SGA (可变区) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Database Buffer Cache (数据库缓冲区) │ │
│ │ ├── DEFAULT 池 (标准块,默认 8KB) │ │
│ │ ├── KEEP 池 (常驻内存) │ │
│ │ ├── RECYCLE 池 (快速回收) │ │
│ │ └── nK 缓冲区 (非标准块 2/4/16/32KB) │ │
│ └─────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Shared Pool (共享池) │ │
│ │ ├── Library Cache (库缓存) │ │
│ │ │ ├── SQL 文本解析结果 │ │
│ │ │ ├── 执行计划 │ │
│ │ │ └── PL/SQL 编译结果 │ │
│ │ └── Data Dictionary Cache (数据字典缓存) │ │
│ │ ├── 表/列定义 │ │
│ │ ├── 用户权限 │ │
│ │ └── 统计信息 │ │
│ └─────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Redo Log Buffer (重做日志缓冲区) │ │
│ │ └── 循环缓冲区,LGWR 定期写入磁盘 │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
2.1.2 Buffer Cache 工作机制
-- 查看 Buffer Cache 命中率
SELECT
ROUND((1 - (physical_reads / (db_block_gets + consistent_gets))) * 100, 2)
AS buffer_cache_hit_ratio
FROM v$buffer_pool_statistics
WHERE name = 'DEFAULT';
-- 查看 Buffer Cache 详细状态
SELECT
name,
block_size/1024 AS block_size_kb,
current_size/1024/1024 AS size_mb,
buffers,
free_buffer_wait
FROM v$buffer_pool;
LRU 算法原理:
访问数据块流程:
1. 用户请求数据块
│
▼
2. 检查 Buffer Cache (HASH 查找)
│
┌────┴────┐
▼ ▼
命中 未命中
│ │
▼ ▼
直接读取 从磁盘读取
│ │
│ 加入 MRU 端
│ (Most Recently Used)
│ │
└────┬────┘
▼
3. 返回数据给用户
LRU 链管理:
[MRU] ←── 热端 ──→ [LRU]
新数据 冷数据
频繁访问 待淘汰
2.1.3 Shared Pool 优化
-- 检查 Shared Pool 使用率
SELECT
ROUND(pool_size/1024/1024, 2) AS pool_size_mb,
ROUND(used_space/1024/1024, 2) AS used_mb,
ROUND((used_space/pool_size)*100, 2) AS usage_pct
FROM (
SELECT
SUM(bytes) AS pool_size
FROM v$sgastat
WHERE pool = 'shared pool'
), (
SELECT
SUM(bytes) AS used_space
FROM v$sgastat
WHERE pool = 'shared pool' AND name != 'free memory'
);
-- 查看 Library Cache 命中率
SELECT
namespace,
pins,
pinhits,
ROUND(pinhits/pins*100, 2) AS hit_ratio
FROM v$librarycache
WHERE namespace IN ('SQL AREA', 'TABLE/PROCEDURE', 'BODY', 'TRIGGER');
2.2 进程架构
2.2.1 后台进程详解
| 进程 | 全称 | 功能 | 关键作用 |
|---|---|---|---|
| DBWn | Database Writer | 将脏缓冲区写入数据文件 | 延迟写,减少 I/O |
| LGWR | Log Writer | 将 Redo Buffer 写入日志文件 | 顺序写,保证事务持久性 |
| CKPT | Checkpoint | 触发检查点,同步数据文件头 | 缩短恢复时间 |
| SMON | System Monitor | 实例恢复、清理临时段 | 自动故障恢复 |
| PMON | Process Monitor | 清理失败进程资源 | 连接异常处理 |
| ARCn | Archiver | 归档在线日志到归档目录 | DataGuard 基础 |
| RECO | Recoverer | 分布式事务恢复 | 两阶段提交 |
| MMON | Manageability Monitor | AWR 快照采集 | 性能诊断 |
2.2.2 检查点机制
检查点触发条件:
1. 日志切换 (ALTER SYSTEM SWITCH LOGFILE)
│
▼
2. 达到检查点间隔时间 (LOG_CHECKPOINT_TIMEOUT)
│
▼
3. 达到检查点间隔 Redo 量 (LOG_CHECKPOINT_INTERVAL)
│
▼
4. 手动触发 (ALTER SYSTEM CHECKPOINT)
│
▼
5. 正常关闭数据库 (SHUTDOWN IMMEDIATE/TRANSACTIONAL)
│
▼
┌─────────────────────────────────────────┐
│ CKPT 进程执行: │
│ 1. 触发 DBWn 写脏块 │
│ 2. 更新控制文件 SCN │
│ 3. 更新数据文件头 SCN │
└─────────────────────────────────────────┘
2.3 存储结构
2.3.1 物理存储 vs 逻辑存储
物理存储结构 逻辑存储结构
────────────────────────────────────────────────────────────
数据文件 (.dbf) 表空间 (Tablespace)
│ │
├── SYSTEM ├── SYSTEM
├── SYSAUX ├── SYSAUX
├── UNDOTBS ├── UNDO
├── USERS ├── USERS
├── TEMP ├── TEMP
└── 自定义数据文件 └── 自定义表空间
控制文件 (.ctl) 段 (Segment)
├── 数据库物理结构信息 ├── 表段
├── 当前日志序列号 ├── 索引段
└── 检查点信息 └── 回滚段
重做日志文件 (.log) 区 (Extent)
├── 在线日志组 ├── 连续的数据块
└── 成员镜像 └── 段的增长单位
归档日志 (.arc) 数据块 (Block)
├── 最小 I/O 单位
├── 默认 8KB
└── 包含多行数据
2.3.2 表空间管理
-- 创建表空间
CREATE TABLESPACE users_ts
DATAFILE '/u01/app/oracle/oradata/ORCL/users_ts01.dbf'
SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 2G
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
-- 查看表空间使用情况
SELECT
tablespace_name,
ROUND(total_bytes/1024/1024/1024, 2) AS total_gb,
ROUND(used_bytes/1024/1024/1024, 2) AS used_gb,
ROUND((used_bytes/total_bytes)*100, 2) AS usage_pct
FROM (
SELECT
tablespace_name,
SUM(bytes) AS total_bytes
FROM dba_data_files
GROUP BY tablespace_name
) df
JOIN (
SELECT
tablespace_name,
SUM(bytes) AS used_bytes
FROM dba_segments
GROUP BY tablespace_name
) seg ON df.tablespace_name = seg.tablespace_name
ORDER BY usage_pct DESC;
2.4 事务与并发控制
2.4.1 ACID 特性实现
| 特性 | Oracle 实现机制 |
|---|---|
| Atomicity (原子性) | Undo 段实现事务回滚 |
| Consistency (一致性) | SCN 保证读一致性 |
| Isolation (隔离性) | 锁机制 + MVCC |
| Durability (持久性) | Redo Log + 归档 |
2.4.2 Undo 机制
Undo 段作用:
1. 事务回滚
UPDATE emp SET sal = 5000 WHERE empno = 7369;
│
├── 原值 (sal=3000) 写入 Undo 段
├── 数据块更新为新值
└── 如需回滚,从 Undo 读取原值恢复
2. 读一致性
会话 A 查询 (SCN=1000)
│
├── 会话 B 更新数据 (SCN=1001)
├── 会话 A 仍看到 SCN=1000 的数据
└── 通过 Undo 构造一致性读
3. 闪回查询
SELECT * FROM emp AS OF TIMESTAMP
TO_TIMESTAMP('2026-04-15 10:00:00', 'YYYY-MM-DD HH24:MI:SS');
2.5 本章小结
核心要点
- SGA 调优:Buffer Cache 命中率 > 95%,Shared Pool 避免硬解析
- 后台进程:LGWR/DBWn 协调工作,CKPT 控制恢复时间
- 存储层次:表空间 → 段 → 区 → 数据块
- 事务机制:Undo 保证一致性,Redo 保证持久性
下一步:学习 第三章:SQL 基础与数据类型