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 本章小结

核心要点
  1. SGA 调优:Buffer Cache 命中率 > 95%,Shared Pool 避免硬解析
  2. 后台进程:LGWR/DBWn 协调工作,CKPT 控制恢复时间
  3. 存储层次:表空间 → 段 → 区 → 数据块
  4. 事务机制:Undo 保证一致性,Redo 保证持久性

下一步:学习 第三章:SQL 基础与数据类型