🌺The Begin🌺点点关注,收藏不迷路🌺


一、开篇奇想:Oracle实例如果是一个人,后台进程就是他的器官

当你执行 STARTUP 启动Oracle数据库时,在服务器上运行 ps -ef | grep ora_,你会看到一系列以 ora_ 开头的进程整齐列队。这些不是Bug,也不是病毒,而是Oracle数据库赖以生存的“器官”——后台进程。

如果把Oracle实例比作一个活生生的人,那么SGA就是大脑皮层(记忆与思考),而后台进程就是心、肝、脾、肺、肾——各司其职,默默运转,缺一不可。

用户进程只需发号施令,真正干苦力活、擦屁股活、写日记活、搞卫生活的,全是这些后台进程。今天这篇文章,带你从“人体器官”的视角,彻底搞懂Oracle后台进程的分工与协作。


二、全景协作图:一条UPDATE语句背后的进程交响乐

先通过一张流程图,看清当用户执行一条简单的 UPDATE 语句时,各后台进程是如何协同工作的:

PMON-进程监控进程 SMON-系统监控进程 CKPT-检查点进程 LGWR-日志写进程 DBWn-数据库写进程 服务器进程 用户进程 PMON-进程监控进程 SMON-系统监控进程 CKPT-检查点进程 LGWR-日志写进程 DBWn-数据库写进程 服务器进程 用户进程 延迟写入,不阻塞用户 持续监控所有进程状态 必要时执行实例恢复 1.执行UPDATE语句 2.将数据块读入Buffer Cache 3.修改Buffer Cache中的数据块(产生脏块) 4.在Redo Log Buffer中记录变更向量 5.用户提交COMMIT 6.立即将Redo Log Buffer写入联机重做日志 7.提交成功,返回用户 8.定期触发检查点 9.通知DBWn将脏块写入数据文件 10.更新控制文件和数据文件头 11.批量将脏块写入数据文件

关键解读:

  • 红色路径(LGWR): 事务提交时唯一的同步写入,性能关键路径。
  • 蓝色路径(DBWn): 异步批量写入,不阻塞用户操作。
  • 橘色路径(CKPT): 定期触发,减少实例恢复时间。
  • 绿色守护(PMON/SMON): 持续后台监控,处理异常和回收资源。

三、后台进程的本质定义:什么是后台进程?

1. 后台进程的精准定义

核心描述:
后台进程是Oracle实例启动时自动创建的一组操作系统进程,它们独立于用户连接专门负责执行I/O操作、监控系统状态、维护数据一致性、处理异常恢复等关键任务。

后台进程的三大特征:

  1. 独立运行: 不依赖任何用户会话,实例不关闭,它们就在运行。
  2. 异步处理: 将用户进程的I/O等待转化为后台的异步处理,大幅提升用户体验。
  3. 强制存在: 某些核心进程缺失,实例将立即崩溃。

如何查看后台进程?

-- 查看所有后台进程
SELECT pname, description FROM V$BGPROCESS WHERE pname IS NOT NULL;

-- Linux命令行查看
ps -ef | grep ora_ | grep -v grep

2. 后台进程的分类体系

Oracle后台进程按重要性分为两大类:

分类 特征 代表进程
强制后台进程 实例运行必须有,缺失会导致实例崩溃 DBWn, LGWR, CKPT, SMON, PMON, RECO
可选后台进程 根据配置或功能按需启动 ARCn, CJQ0, Jnnn, Dnnn, MMON, MMNL

以下重点介绍8个最常见、最核心的后台进程。


四、八大核心后台进程逐一拆解

1. DBWn(Database Writer):数据库写进程

核心职责: 将Buffer Cache中的脏块(Dirty Buffers) 批量写入数据文件。

为什么需要DBWn?

  • 用户修改数据只是改了内存中的Buffer Cache,并没有直接写磁盘。
  • 如果每次修改都同步写磁盘,数据库性能将惨不忍睹。
  • DBWn负责延迟批量写入,实现异步I/O。

DBWn被唤醒的四种情况:

  1. 检查点触发: CKPT通知DBWn开始写脏块。
  2. Buffer Cache空间不足: 需要腾出空闲缓冲区。
  3. 脏块数量达到阈值: 脏列表太长,必须清理。
  4. 超时触发: 每3秒自动醒来检查一次。

进程数量: 默认可有多个(DBW0~DBWn),通过参数 DB_WRITER_PROCESSES 控制。


2. LGWR(Log Writer):日志写进程

核心职责: 将Redo Log Buffer中的重做记录写入联机重做日志文件。

为什么LGWR是性能关键?

  • 事务提交时,LGWR必须将对应的重做记录写入磁盘,事务才算提交成功。
  • 这是整个Oracle体系中最关键的同步操作,直接影响事务响应时间。

LGWR被触发的五种情况:

  1. 用户提交COMMIT: 必须立即写入。
  2. Redo Log Buffer满1/3: 提前刷盘。
  3. Redo Log Buffer达到1MB: 批量刷盘。
  4. DBWn写脏块之前: 先写日志,后写数据(Write-Ahead Logging原则)。
  5. 超时触发: 每3秒自动检查。

LGWR只有一个: 这是单点,必须通过高性能磁盘(如SSD)保障其写入速度。


3. CKPT(Checkpoint Process):检查点进程

核心职责: 触发检查点,通知DBWn写脏块,更新控制文件和数据文件头。

检查点的核心作用:

  • 缩短实例恢复时间。检查点越频繁,崩溃后需要前滚的日志越少。
  • 将Buffer Cache中的脏块批量刷盘,保持数据文件与日志的同步。

CKPT的三种触发方式:

  1. 日志切换: 每次切换日志组时自动触发。
  2. 手动触发: ALTER SYSTEM CHECKPOINT;
  3. 参数控制: 通过 FAST_START_MTTR_TARGET 设置恢复时间目标。

CKPT与DBWn的关系:

  • CKPT是“指挥官”,DBWn是“执行者”。
  • CKPT通知DBWn开始写,但CKPT自己不写数据块。

4. SMON(System Monitor):系统监控进程

核心职责: 执行实例恢复、回收临时段、合并空闲空间。

SMON的五大任务:

  1. 实例恢复(Crash Recovery): 数据库异常关闭后重新启动时,自动进行前滚和回滚。
  2. 回收临时段: 清理排序操作留下的临时表空间碎片。
  3. 合并空闲空间: 将相邻的空闲区合并为大块,减少碎片。
  4. 清理不再使用的回滚段。
  5. 在RAC环境中执行节点恢复。

SMON是Oracle的“自动修复工”,很多情况下数据库挂了能自动恢复,全靠它。


5. PMON(Process Monitor):进程监控进程

核心职责: 监控所有服务器进程,清理失败进程持有的资源

PMON的四大任务:

  1. 检测进程死亡: 定期轮询所有服务器进程。
  2. 释放锁: 用户异常断连,PMON释放该用户持有的所有锁。
  3. 回滚未提交事务: 清理死进程的事务。
  4. 释放资源: 释放SGA中的Latch、Buffer Pin等资源。

PMON与SMON的区别:

  • PMON管“个人卫生”,处理单个进程的问题。
  • SMON管“公共卫生”,处理系统级的问题。

6. ARCn(Archiver):归档进程

核心职责: 在归档模式下,将填满的联机重做日志复制到归档日志

为什么必须开启归档?

  • 不开归档,联机日志循环覆盖后,之前的变更记录永久丢失,无法进行介质恢复。
  • 开启归档,所有历史变更都被永久保存,可以恢复到任意时间点。

ARCn的数量: 默认可有多个(ARC0~ARCn),通过参数 LOG_ARCHIVE_MAX_PROCESSES 控制。

LGWR与ARCn的关系:

  • LGWR写联机日志(速度快,循环写)。
  • ARCn读联机日志并复制到归档日志(速度慢,顺序写)。

7. CJQ0与Jnnn(Job Queue Coordinator & Processes):作业队列进程

核心职责: 执行Oracle调度器(DBMS_SCHEDULER)定义的定时任务。

工作原理:

  1. CJQ0是协调器,定期检查作业队列。
  2. 发现有到期任务,启动Jnnn进程执行任务。
  3. 任务执行完毕,Jnnn进程退出。

典型应用:

  • 定期收集统计信息(Gather Stats Job)。
  • 定时数据泵导出。
  • 自动空间管理任务。

8. MMON与MMNL(Manageability Monitor):可管理性监控进程

核心职责: 支持Oracle的自动工作负载仓库(AWR),收集性能数据。

分工协作:

  • MMON: 每小时生成一份AWR快照,分析性能趋势。
  • MMNL: 将Active Session History(ASH)数据从SGA刷到磁盘。

没有这两个进程,Oracle的自动诊断和性能调优将无从谈起。


五、后台进程协同作战:实例恢复的完整流程

当数据库异常崩溃后重启,SMON如何协调各进程完成自动恢复?

是,需要恢复

否,已一致

数据库异常崩溃

重新STARTUP

SMON读取控制文件

找到所有数据文件的检查点SCN

找到联机重做日志的最新序列号

数据文件SCN < 日志SCN?

前滚阶段-Roll Forward

打开数据库

LGWR重演日志中的变更

将已提交事务的脏块写入数据文件

回滚阶段-Roll Back

SMON回滚未提交的事务

整个恢复过程全自动,无需DBA手工干预。这就是Oracle后台进程协作的精妙之处。


六、八大后台进程速查表

序号 进程名 核心使命 如果挂掉会怎样
1 DBWn 将脏块写入数据文件 Buffer Cache满后数据库挂起
2 LGWR 将重做记录写入联机日志 事务无法提交,数据库立即瘫痪
3 CKPT 触发检查点,更新文件头 实例恢复时间极长
4 SMON 实例恢复、空间回收 崩溃后无法自动恢复
5 PMON 清理死进程资源 锁不释放,其他用户阻塞
6 ARCn 复制归档日志 日志切换卡住,数据库挂起
7 CJQ0 调度定时任务 所有定时任务停止执行
8 MMON 生成AWR快照 无法分析历史性能

七、总结:记住这个“人体器官类比”就够了

【后台进程 = Oracle实例的器官系统】

  • DBWn是消化系统: 负责把营养(数据)输送到仓库(数据文件)。
  • LGWR是循环系统: 心脏跳动,记录每一次血液流动(数据变更)。
  • CKPT是神经系统: 发出指令,告诉各器官该干活了。
  • SMON是免疫系统: 生病了自动修复,清理体内垃圾。
  • PMON是排泄系统: 单个细胞坏死,及时清理,防止感染扩散。

理解后台进程,你就理解了Oracle为什么能够号称“永不宕机”。这些默默无闻的守护者,才是Oracle稳定性的真正基石。

你在日常运维中,是否遇到过某个后台进程异常导致数据库故障的经历?是通过什么视图或日志定位到问题的?欢迎在评论区分享你的排障故事。


在这里插入图片描述


🌺The End🌺点点关注,收藏不迷路🌺

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐