Oracle 数据库体系结构总览

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 内存结构

内存区作用共享性
SGASystem Global Area,所有进程共享共享
PGAProgram Global Area,单进程私有私有
UGAUser Global Area,会话级共享服务器模式下位于 SGA

2.2 后台进程

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

3. 数据库(Database)

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

文件类型作用必需
数据文件(Data File)存储表/索引数据
控制文件(Control File)记录数据库物理结构
在线 Redo Log记录所有变更,用于恢复
归档 Redo LogRedo 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