Oracle 数据库体系结构总览

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


1. 概述

Oracle 数据库体系结构由**实例(Instance)和数据库(Database)**两部分组成[1],二者解耦的设计是 Oracle 高可用与高性能的基础。

+--------------------------------------------+
|              Oracle Server                 |
| +----------------------+ +---------------+ |
| |     Instance         | |   Database    | |
| |  - SGA (共享内存)    | | - 数据文件    | |
| |  - PGA (私有内存)    | | - 控制文件    | |
| |  - 后台进程          | | - Redo Log    | |
| |    (PMON/SMON/...)   | | - 归档日志    | |
| +----------------------+ +---------------+ |
+--------------------------------------------+

2. 实例(Instance)

实例是一组内存结构和后台进程的集合,实例启动后才有”生命”[1][2]。

2.1 内存结构

内存区 作用 共享性
SGA System Global Area,所有进程共享 共享
PGA Program Global Area,单进程私有 私有
UGA User Global Area,会话级 共享服务器模式下位于 SGA

2.2 后台进程

进程 作用
PMON 进程监视,清理异常终止的进程
SMON 系统监视,实例恢复、空间合并
DBWn 数据库写进程,脏块落盘
LGWR 日志写进程,Redo Log Buffer 落盘
CKPT 检查点进程,更新控制文件/数据文件头
ARCn 归档进程,复制 Redo Log 到归档
MMON AWR 数据采集
RECO 分布式事务恢复

3. 数据库(Database)

数据库是磁盘上的物理文件集合[1]:

文件类型 作用 必需
数据文件(Data File) 存储表/索引数据 是
控制文件(Control File) 记录数据库物理结构 是
在线 Redo Log 记录所有变更,用于恢复 是
归档 Redo Log Redo Log 的历史副本 否(归档模式下)
参数文件(PFILE/SPFILE) 实例启动配置 是
密码文件(orapwd) SYSDBA 认证 否
警报日志(alert.log) 诊断信息 自动生成

4. 逻辑结构与物理结构对应

Database
  └── Tablespace(表空间,逻辑)
        └── Segment(段,如表段/索引段)
              └── Extent(区,连续数据块)
                    └── Data Block(数据块,最小 I/O 单位)

物理对应:
Tablespace ──> Data File(一个表空间可含多个数据文件)
Segment    ──> 跨多个 Extent,分布于数据文件
Block      ──> OS Block(多个 OS 块组成一个 Oracle 块)

5. 多租户架构(12c+)

从 12c 开始引入 CDB/PDB 架构[2]:

CDB(Container Database)
  ├── CDB$ROOT   : 根容器,存储公共元数据
  ├── PDB$SEED   : 种子 PDB,作为模板
  ├── PDB_SALES  : 业务 PDB 1
  ├── PDB_HR     : 业务 PDB 2
  └── ...        : 最多 252 个 PDB(19c)/ 1024 个(23ai)

优势:

  • 资源共享:多个 PDB 共享一个实例的 SGA/后台进程
  • 隔离性:PDB 间数据隔离,互不干扰
  • 可移植:PDB 可拔插,便于迁移

6. 相关视图与命令

-- 实例信息
SELECT instance_name, status, version FROM v$instance;

-- 数据库信息
SELECT name, open_mode, log_mode, cdb FROM v$database;

-- SGA 信息
SELECT * FROM v$sgainfo;

-- 后台进程
SELECT name, description FROM v$bgprocess WHERE paddr <> '00';

-- 表空间
SELECT tablespace_name, status FROM dba_tablespaces;

-- 数据文件
SELECT file#, name, status, bytes/1024/1024 AS mb FROM v$datafile;

-- 控制文件
SELECT name, status FROM v$controlfile;

-- CDB/PDB 信息(12c+)
SELECT con_id, name, open_mode FROM v$pdbs;

7. 常见坑与排错

7.1 实例与数据库混淆

现象:误以为”启动实例=数据库可用”。

澄清:

  • 实例启动到 NOMOUNT 状态时,只读了参数文件
  • 数据库要进入 OPEN 状态才完全可用
  • 一个实例只能对应一个数据库(RAC 是多实例对应一个数据库)

7.2 不理解 SGA 与 PGA 区别

-- 查询 SGA 与 PGA 当前使用
SELECT 
  (SELECT SUM(value) FROM v$sga) AS sga_total,
  (SELECT SUM(value) FROM v$pgastat WHERE name='total PGA allocated') AS pga_total
FROM dual;

7.3 控制文件丢失导致无法启动

-- 启动报 ORA-00205
STARTUP NOMOUNT;
SHOW PARAMETER control_files;
-- 恢复步骤详见:Oracle 控制文件深度解析.md

8. 最佳实践

  1. 生产环境使用 SPFILE:动态参数可在线修改
  2. 控制文件多路复用:至少 3 份,分布在不同磁盘
  3. Redo Log 多路复用:每组至少 2 个 member
  4. 启用归档模式:保证可恢复性
  5. 合理规划 SGA/PGA:使用 AMM 或 ASMM 自动管理
  6. 多租户规划:业务隔离使用 PDB
  7. 定期备份 SPFILE 和控制文件

9. 参考资料

[1] Oracle Database Concepts 19c, “Oracle Database Architecture”
https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/oracle-database-architecture.html

[2] Oracle Database Concepts 19c, “Multitenant Architecture”
https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/multitenant-architecture.html

[3] 墨天轮,”Oracle 体系结构深度解析”
https://www.modb.pro/db/1759656813559025664