Oracle 核心体系架构学习系列一:从内存、进程到磁盘的底层逻辑学习

作为一名数据库从业者,Oracle 体系架构是绕不开的第一道坎,也是后续所有故障排查、性能调优、高可用设计的根基。很多初学者学了很久,依然分不清 "实例" 和 "数据库",搞不懂内存里到底存了什么,后台进程各自在忙什么。今天我们就用最直白的方式,把 Oracle 最核心的三大块 ------内存、进程、磁盘文件讲透,帮你建立完整的架构认知。

一、整体架构总览:先搞懂最容易混淆的两个概念

Oracle 数据库的运行,本质上是内存 + 进程 + 磁盘文件 三者协同工作的结果。其中最核心、最复杂的部分,就是位于整个架构中心的SGA(System Global Area,系统全局区),它是数据库的 "内存大脑"。

围绕着 SGA,分布着两类进程:

  • 后台进程:数据库的 "后勤部队",默默完成数据持久化、故障恢复、资源管理等后台工作
  • 前台进程:数据库的 "前台接待",直接对接用户客户端,处理 SQL 请求并返回结果

这里必须先记住两个最核心、最容易混淆的定义:

实例(Instance) = SGA 内存 + 所有后台进程它是数据库运行时的 "动态部分",数据库启动就是启动实例,实例关闭就意味着数据库停止运行。

数据库(Database) = 磁盘上的所有物理文件(数据文件、控制文件、重做日志文件等)它是数据库的 "静态部分",是数据持久化存储的载体,只要文件还在,数据就不会丢失。

实例和数据库的对应关系只有两种:

  • 一对一:单实例数据库,也是绝大多数生产环境的部署方式
  • 多对一:RAC(实时应用集群),多个服务器上的实例同时访问同一个共享磁盘上的数据库,实现高可用和负载均衡

二、SGA 内存结构:数据库的 "高速缓存大脑"

SGA 是 Oracle 实例启动时,从操作系统申请的一块共享内存区域,所有用户进程和后台进程都可以访问。它的设计目标只有一个:尽可能减少磁盘 I/O,因为磁盘 I/O 的速度比内存慢了几个数量级。

SGA 主要包含 6 个内存池,其中 3 个是必选(缺一不可),3 个是可选(根据业务需求启用)。

2.1 三个必选内存池:数据库运行的基础

1. 共享池(Shared Pool)

共享池是 SGA 中最复杂、最容易出性能问题的部分,也是 SQL 优化的核心战场。

  • 核心功能:共享可复用的信息,避免重复解析和计算
  • 核心组成:
    • 库缓存(Library Cache):存储 SQL 语句的文本、解析树和执行计划。如果两条 SQL 完全一致,Oracle 会直接复用已有的执行计划,这就是 "软解析",性能远高于重新解析的 "硬解析"
    • 数据字典缓存(Row Cache):存储数据库的元数据,比如表名、列名、用户权限、表空间信息等,每次执行 SQL 都需要查询这些信息
  • 11g 及以上版本新增:结果集缓存,直接缓存 SQL 语句的执行结果,适合频繁执行的静态查询
  • 其他存储内容:锁信息、高级队列信息、PL/SQL 程序代码等
2. 数据库缓冲区缓存(Database Buffer Cache)

这是 SGA 中占比最大的内存区域,通常会占到 SGA 总大小的 60%-80%。

  • 核心功能:缓存从磁盘数据文件读取的数据块。用户查询数据时,先在缓存中找,找到就直接返回,找不到才去磁盘读取并缓存
  • 缓存算法:基于 LRU(最近最少使用)算法及其变种,当缓存满了的时候,优先淘汰最近最少使用的数据块
  • 常见性能问题:热块争用(多个进程同时访问同一个数据块)、闩锁竞争,这些都会导致数据库响应变慢
3. 重做日志缓冲区(Redo Log Buffer)

这是 SGA 中最小但最重要的内存池之一,是 Oracle 事务持久性的保障。

  • 核心功能:缓存数据库所有修改操作产生的重做日志记录。任何对数据的修改,都会先写重做日志,再写数据缓存
  • 作用:当数据库突然崩溃时,可以通过重做日志恢复所有已提交但还没写入磁盘的数据

2.2 三个可选内存池:按需启用

  • 大池(Large Pool):专门用于大 I/O 操作,比如 RMAN 备份恢复、批量数据加载。如果不配置大池,这些操作会占用共享池,容易导致共享池内存不足。另外,共享服务器模式下的用户全局区(UGA)也会存放在大池里
  • Java 池(Java Pool):为数据库内部运行的 Java 虚拟机提供内存支持,只有当使用 Java 存储过程时才需要
  • 流池(Streams Pool):用于 Oracle Streams 数据复制和消息队列功能,现在基本被 GoldenGate 取代,很少使用

三、后台进程:数据库的 "隐形守护者"

后台进程是 Oracle 实例的 "心脏",负责维护数据库的正常运行。其中有 6 个是必选后台进程,任何一个异常终止,都会导致整个数据库实例崩溃宕机。

3.1 六大必选后台进程详解

1. PMON(Process Monitor,进程监控进程)

所有后台进程中最重要的一个,堪称 "进程管家"。

  • 核心功能:
    • 监控其他所有进程的运行状态,如果某个进程异常崩溃或卡住,PMON 会自动清理它,释放占用的内存、锁和其他资源
    • 动态监听注册:每 60 秒向监听器注册一次实例和服务名信息,这就是为什么不用配置静态监听也能连接数据库的原因
2. SMON(System Monitor,系统监控进程)

数据库的 "急救医生",负责系统级别的恢复和清理。

  • 核心功能:
    • 实例恢复:数据库异常关闭后,下次启动时自动执行实例恢复,回滚未提交的事务,重做已提交但未写入磁盘的数据
    • 清理临时段和表空间碎片(在现在的 ASSM 自动段空间管理模式下,这个功能已经大幅弱化)
3. RECO(Recoverer,恢复进程)

分布式事务的 "调解员",专门处理跨库事务的一致性问题。

  • 举个例子:通过 DBLink 做跨库转账,A 账户扣款成功,但 B 账户所在的数据库突然宕机。这时 RECO 会定期重试 B 节点的操作,如果重试失败,就会回滚 A 账户的扣款,保证分布式事务的 ACID 特性
4. DBWn(Database Writer,数据库写进程)

负责把内存中的数据持久化到磁盘。

  • 核心功能:将数据库缓冲区缓存中的脏块(已修改但未写入磁盘的数据块)批量写入磁盘的数据文件
  • 说明:n 表示可以有多个 DBWn 进程,生产环境通常会配置多个,提高写操作的并发性能
5. CKPT(Checkpoint,检查点进程)

数据库恢复的 "路标",决定了崩溃恢复需要多长时间。

  • 核心功能:触发检查点事件,当 DBWn 写完一批脏块后,CKPT 会在数据文件头部控制文件中写入检查点信息(包含 SCN 系统改变号和 RBA 重做字节地址)
  • 作用:检查点之前的所有修改都已经持久化到磁盘,数据库崩溃恢复时,只需要从检查点开始重做日志即可,大大缩短恢复时间
6. LGWR(Log Writer,日志写进程)

Oracle "先写日志后写数据" 机制的执行者。

  • 核心功能:将重做日志缓冲区中的重做日志记录写入磁盘的重做日志文件
  • 关键触发条件:
    • 任何事务提交时
    • 重做日志缓冲区满 1/3 时
    • 每隔 3 秒
    • DBWn 写脏块之前(必须保证日志先于数据写入磁盘)

3.2 常见可选后台进程

除了上面 6 个,其他后台进程都是按需启用的,这里列举几个生产环境常用的:

  • MMAN:10g 及以上引入,负责 SGA 内存的自动管理,动态调整各个内存池的大小
  • MMON:负责收集数据库性能统计信息,生成 AWR、ADDM 报告,是性能调优的基础
  • ARCn:归档进程,数据库运行在归档模式下时,将写满的重做日志文件归档保存,是备份恢复和 Data Guard 的基础
  • MRPn:Data Guard 备用数据库的托管恢复进程,负责应用主库传过来的重做日志
  • DBSNMP:企业管理器(EM)的代理进程,收集监控数据

四、前台进程与客户端连接流程

最后我们梳理一下用户连接数据库的完整流程,把前面讲的所有组件串起来:

  1. 用户在客户端启动应用程序(用户进程),向服务器的监听器发起连接请求
  2. 监听器验证请求合法后,为这个用户创建一个专属的前台进程(服务器进程)
  3. 前台进程接收用户的 SQL 请求,在 SGA 中分配必要的资源,解析并执行 SQL
  4. 如果需要访问数据,先在数据库缓冲区缓存中查找,找不到就从磁盘读取到缓存
  5. 所有修改操作先写入重做日志缓冲区,再修改数据缓存
  6. 事务提交时,LGWR 将重做日志缓冲区的内容写入磁盘,事务才算真正完成
  7. 前台进程将执行结果返回给用户进程

五、总结

Oracle 体系架构看似复杂,其实核心逻辑非常清晰:用内存换速度,用日志保安全,用进程做分工

  • 内存(SGA)是高速缓存,所有操作都先在内存中完成,尽可能减少磁盘 I/O
  • 后台进程是幕后英雄,负责将内存中的数据持久化到磁盘,保证数据库的稳定性和可恢复性
  • 磁盘文件是最终的存储载体,只要文件完好,数据就不会丢失

掌握了这些核心组件的作用和工作原理,你就具备了 Oracle 故障排查和性能调优的基础。下次遇到数据库宕机、响应慢的问题,就不会再无从下手,而是能快速定位到是内存问题、进程问题还是磁盘问题。

相关推荐
Andya_net2 小时前
网络安全 | 学习NAT44、NAT46、NAT64 与 NAT66原理
学习·web安全·php
施棠海2 小时前
SQLite姓氏数据库首字母检索开发
数据库·oracle
艾莉丝努力练剑2 小时前
【Linux网络】计算机网络入门:从背景到协议,理解网络通信基础
linux·运维·服务器·c++·学习·计算机网络
艾莉丝努力练剑2 小时前
【Linux线程】Linux系统多线程(十):线程安全和重入、死锁相关话题
java·linux·运维·服务器·c++·学习·安全
23471021272 小时前
4.21 学习笔记
软件测试·笔记·python·学习
heimeiyingwang2 小时前
【架构实战】边缘计算架构设计与应用场景
人工智能·架构·边缘计算
zxrhhm2 小时前
Oracle RAC 日常监控脚本
数据库·oracle
Keep Running *2 小时前
Python基础_学习笔记
笔记·python·学习