oracle 主要进程

image-20250624183148222

用户/客户端进程(User/Client Processes)

后台进程(Background Processes)

非核心可选后台进程(Optional Background Processes)

  • 这些进程根据数据库配置或特定功能需求启用,而非实例运行的基础必需进程

  • ARCn(归档进程,如ARC0、ARC1)

    • 作用:在开启**归档模式(ARCHIVELOG)**时,将已满的联机重做日志文件(Online Redo Log)复制到归档日志(Archive Log)。

    • 触发条件:联机日志组切换时。

    • 配置参数:

      • LOG_ARCHIVE_MAX_PROCESSES:控制最大归档进程数(默认值通常为2)。

      • LOG_ARCHIVE_DEST_n:指定归档目标路径。

  • CJQ0(协调器进程)与Jnnn(作业队列进程,如J000、J001)

    • 作用:管理和执行周期性任务(如DBMS_JOB或DBMS_SCHEDULER调度的作业)。

    • 激活条件:

      • 使用定时任务功能时自动启用。

      • 参数JOB_QUEUE_PROCESSES控制Jnnn进程数量(默认值为0,禁用时需要调大)。

  • RECO(分布式恢复进程)

    • 作用:在分布式事务(跨数据库事务)中,自动解决因网络中断或节点故障导致的未完成事务(如两阶段提交失败)。

    • 常见场景:分布式事务提交过程中某个节点宕机,RECO会自动回滚或提交事务。

    • 激活条件:数据库存在分布式事务时自动启用。

  • QMNC(队列监控协调器)与Qnnn(队列监控进程,如Q000、Q001)

    • 作用:

      • QMNC协调和管理AQ消息队列的监控任务。

      • Qnnn子进程具体执行队列的传播、处理订阅通知等操作。

    • 激活条件:

      • 使用AQ功能时自动启用(需执行队列相关操作)。
    • 配置参数:

      • AQ_TM_PROCESSES:控制队列监控进程数量(默认值为1)。
  • MMON(可管理性监控进程)与Mnnn(临时进程)

    • 作用:

      • 收集性能指标,生成ASH(Active Session History)和AWR(Automatic Workload Repository)快照。

      • 自动执行ADDM(Automatic Database Diagnostic Monitor)分析。

    • 触发条件:

      • 默认每小时生成一次AWR快照,通过STATISTICS_LEVEL参数配置数据收集级别。
  • LSP0(逻辑备库进程)

    • 作用:在逻辑备库(Logical Standby)中,解析主库传输的Redo日志,转换为SQL语句在备库执行。

    • 激活条件:仅当逻辑备库模式启用时存在。

  • DBRM(数据库资源管理进程)

    • 作用:执行资源管理计划(Resource Manager),控制CPU、并行度等资源分配。

    • 激活条件:启用资源管理器(RESOURCE_MANAGER_PLAN参数指定计划)时启用。

  • DIAG(诊断守护进程)

    • 作用:监控实例健康状态(如hang检测),生成诊断转储文件。
  • VKTM(虚拟时间管理进程)

    • 作用:提供高精度时间同步服务(如Flashback、SCN生成依赖)。
  • FBDA(Flashback数据归档进程)

    • 作用:在启用Flashback Data Archive时,负责将历史数据归档到指定表空间。
  • LMON(全局队列服务监控进程):管理集群全局资源和节点状态。

  • LMD(全局队列服务守护进程):处理全局锁请求。

  • LCKn(全局锁进程):管理实例间的资源锁定。

  • RMSn(资源管理进程):协调集群资源分配(如服务优先级)。

核心后台进程

PMON(Process Monitor,进程监控器)

  • 核心职责:

    • 异常会话清理:当用户进程异常终止(如客户端断连、进程崩溃)时,PMON 负责回收该会话占用的资源(如内存、锁)。

    • 会话状态回滚:如果会话在事务未提交时终止,PMON 会回滚未提交的事务(即恢复至一致性状态)。

    • 注册失败清理:释放失效的监听注册信息,确保客户端能重新连接。

  • 典型案例:

    • 用户执行一个长时间事务,中途断网导致会话中断 → PMON自动回滚未提交操作,释放该会话的锁和事务槽(Transaction Slot)。

SMON(System Monitor,系统监控器)

  • 核心职责:

    • 数据库异常关闭(如断电)后重启时,SMON 执行以下操作:

      • 前滚(Redo Apply):基于重做日志(Redo Log)重放最后一次检查点(Checkpoint)后的操作,恢复已提交但未写入数据文件的修改。

      • 回滚(Undo Apply):使用撤销段(Undo Segments)回滚未提交的事务。

  • 空间管理:

    • 合并表空间中连续的未使用块(Free Space Coalescing),避免碎片化。

    • 清理临时表空间的残留临时段(Temporary Segments)。

    • 字典表维护:定期验证系统表空间(如 SYSTEM 表空间)的一致性。

  • 典型案例:

    • 数据库崩溃后重启 → SMON 自动执行实例恢复,保证数据一致性。

DBWn(Database Writer,数据写入进程)

  • DBWn的角色与核心职责

    • DBWn是数据库缓冲区缓存(Buffer Cache)与物理数据文件之间的桥梁,主要职责是将缓冲区中的脏块异步写入数据文件,保证数据持久性。

    • 脏块(Dirty Block):在Buffer Cache中被修改但未写入磁盘的数据块。

    • 异步写入:DBWn的写入操作不与事务提交同步(事务提交仅依赖LGWR刷写Redo Log)。

  • DBWn的底层机制

    • Buffer Cache管理

      • Buffer Cache是内存区域,保存最近访问的数据块(Block)。

      • 数据库缓冲区缓存

    • DBWn的关键行为:

      • 将脏块从Buffer Cache写入数据文件(写操作完成后,脏块变为Clean块,但保留在Buffer Cache中)。

      • 维护LRU(Least Recently Used)链表, 优先淘汰最久未访问的Clean块,释放内存空间。

    • 写入触发条件

      • 检查点(Checkpoint)

        • CKPT进程触发检查点时,DBWn将所有脏块写入磁盘(全量检查点)或特定范围内的脏块(增量检查点)。

        • 增量检查点(默认方式):仅写入由当前检查点SCN(System Change Number)之前的脏块。

      • 缓冲区空间不足

        • 当进程需要读取新块到Buffer Cache时,若发现可用缓冲区不足,触发DBWn清理脏块,释放空间。
      • 定时触发

        • 默认每隔3秒,DBWn会检查一次是否有需要写入的脏块。
      • 表空间操作

        • 执行ALTER TABLESPACE … OFFLINE NORMAL或数据文件离线时,强制写入相关脏块。
    • 多DBWn进程的协作

      • 默认启动1个DBWn进程(DBW0),可通过参数DB_WRITER_PROCESSES配置多个进程(如DBW1、DBW2等),提升高负载下的写入效率。

      • 多进程工作方式:

        • Oracle将Buffer Cache的哈希链(Hash Chain)分片,每个DBWn进程负责特定范围的链,避免锁竞争。

        • 多进程并行写入数据文件(物理写入由操作系统调度)。

  • DBWn的写入流程

    • 脏块标识

      • 每当事务修改Buffer Cache中的块时,将该块标记为脏块,并记录对应的Redo Log条目。
    • 脏块管理

      • 脏块被记录在检查点队列(Checkpoint Queue)中,按修改顺序(LRU+SCN)排序。
    • 触发写入

      • 检查点、定时器或缓冲区空间不足触发DBWn开始工作。
    • 块筛选与批量写入

      • DBWn从检查点队列中批量获取脏块(默认每次批量写入数百至数千个块)。

      • 使用异步I/O(如果操作系统支持)批量写入数据文件,减少磁盘寻址开销。

    • 数据文件同步

      • 写入完成后,DBWn更新控制文件和数据文件头中的检查点信息(SCN)。
    • 清理缓冲区状态

      • 完成写入的脏块变为Clean块,但仍可能继续被访问。
  • DBWn与关键机制的交互

    • (1)与检查点(CKPT)进程的协作

      • 检查点触发场景:

        • 日志切换(Log Switch)。

        • 手动执行ALTER SYSTEM CHECKPOINT。

        • 根据FAST_START_MTTR_TARGET设定自动触发增量检查点。

      • 增量检查点流程:

        • CKPT进程不断更新控制文件中的检查点SCN(RBA,Redo Block Address)。

        • DBWn根据SCN将检查点队列中低于该SCN的脏块刷盘。

        • 减少实例恢复时需要回放的重做日志量。

    • (2)与LGWR进程的关系

      • 写入顺序约束:

      • 若某脏块的修改对应的Redo Log记录未被LGWR写入联机日志文件,DBWn不会将该脏块写入数据文件。

    • (3)多缓冲区池管理

      • 若配置多个Buffer Pool(KEEP、RECYCLE、DEFAULT),DBWn需分别处理各自池中的脏块。

      • KEEP池中的块可能优先保留在内存中(少写入),而RECYCLE池的块可能更快被淘汰。

  • 总结

    • DBWn的本质作用:内存与磁盘间的异步数据同步,平衡性能与持久性。

    • 核心流程:脏块排队 → 批量触发 → 异步写入 → 状态更新。

    • 调优关键:避免磁盘I/O成为瓶颈,合理分配DBWn进程数量,优化检查点机制。

LGWR(Log Writer,日志写入进程)

  • LGWR的角色与核心职责

    • LGWR负责将重做日志缓冲区(Redo Log Buffer)中的变更记录写入联机重做日志文件(Online Redo Log Files),是保障事务持久性(Durability)的核心进程。

    • 重做日志:记录数据块的所有修改操作(包括未提交事务),用于崩溃恢复和实例恢复。

    • 关键作用:

      • 事务提交时,确保相关Redo日志持久化到磁盘。

      • 支持实例恢复时的前滚(Redo Apply)操作。

  • 触发LGWR写入的条件

    • 事务提交(Commit):

      • 提交事务时,事务对应的所有Redo条目必须由LGWR写入联机日志文件后,事务完成。
    • 每3秒定时写入:

      • 即使无事务提交,每隔3秒LGWR会主动刷新缓冲区。
    • 重做日志缓冲区满1/3或超过1MB:

      • 避免缓冲区被填满导致后续操作阻塞。
    • DBWn写入脏块前:

      • DBWn在写入脏块到数据文件前,需确保其对应Redo日志已写入(WAL原则,即先写日志)。
    • 日志切换(Log Switch):

      • 当前联机日志组写满后,需切换到下一组,此时LGWR完成当前日志组的最终写入。
  • LGWR的底层实现原理

    • (1)重做日志缓冲区(Redo Log Buffer)

      • 位置:位于SGA(系统全局区)中的循环内存区域。

      • 写入流程:

        • 用户事务修改数据块时,生成Redo记录并存入Redo Log Buffer。

        • Redo记录以线程(Thread)为单位按顺序存储(适用于RAC环境)。

        • 每个Redo记录包含SCN(System Change Number),标识变更顺序。

    • (2)Redo条目的结构

      • 变更类型(如INSERT/UPDATE/DELETE)。

      • 变更的数据块地址(数据文件号、块号)。

      • 修改前的数据(Undo信息)和修改后的数据。

      • 事务ID(XID)和SCN。

    • (3)Redo写入的原子性

      • LGWR按事务提交顺序批量写入多个事务的Redo条目,以减少I/O次数。

      • 写入的单位是联机日志文件的一个日志块(通常为512字节或与操作系统块大小对齐)。

  • LGWR的工作流程

    • 缓冲区内容收集:

      • 事务生成Redo记录,存入Redo Log Buffer,形成连续的日志流。
    • 触发条件满足:

      • 事务提交、定时器到期、缓冲区满1/3或超1MB等条件触发LGWR。
    • 批量写入时机:

      • LGWR将缓冲区中从上次写入位置到当前写入点的所有Redo日志一次性写入联机日志文件。

      • 异步I/O利用:若操作系统支持,LGWR以异步方式提交多块写入(提高吞吐量)。

    • 日志文件切换:

      • 若当前联机日志组已写满,触发日志切换(Switch Logfile):

        • LGWR关闭当前日志组,切换到下一个可用日志组。

        • 归档模式下,ARCH进程将已满的日志文件复制到归档目录。

    • 事务确认完成:

      • 事务提交后,在LGWR的写操作完成前,用户进程等待(通过log file sync事件),写入完成后返回成功响应。
  • LGWR与关键机制的协同作用

    • (1)与事务提交的同步(Log File Sync)

      • 原理:事务提交时,必须等待LGWR将相关Redo条目写入联机日志文件。

      • 性能影响:

        • log file sync等待事件过高,可能表明LGWR写入延迟(存储吞吐量不足或日志文件配置不合理)。
    • (2)与DBWn的协作(Write-Ahead Logging, WAL)

      • 规则:DBWn在写入脏块前,必须确保对应的Redo日志已由LGWR写入磁盘。

      • 原因:若数据块已写入而Redo未写入,崩溃时无法恢复(数据文件状态与前滚不一致)。

    • (3)与ARCH进程的协同(归档模式)

      • 归档触发:当日志切换发生时,若开启归档模式(ARCHIVELOG),ARCH进程将已满的联机日志复制到归档目录。

      • 影响:

        • 若归档速度慢于日志生成速度,可能导致日志切换等待(log file switch (archiving needed))。

        • 需通过配置足够的归档进程(ARCn)或优化归档存储避免瓶颈。

  • 总结与最佳实践

    • LGWR的核心作用:确保Redo日志的持久化,保障事务的持久性和恢复能力。

    • 优化方向:

      • 将联机日志文件存放于低延迟、高吞吐的独立存储设备。

      • 设置合理日志文件大小(建议切换间隔在15~30分钟)。

      • 多路复用日志组(避免单点故障)。

    • 扩展知识:

      • 在RAC(Real Application Clusters)环境中,每个实例拥有独立的Redo线程和LGWR进程。

      • DG(Data Guard)通过传输Redo日志实现数据同步,依赖LGWR生成的日志流。

      • 通过深入理解LGWR的工作机制,DBA可以更有效地优化事务处理性能,确保数据库在高并发与高可靠性场景下平稳运行。

CKPT(Checkpoint Process,检查点进程)

  • CKPT的核心职责是推进检查点(Checkpoint),通过协调LGWR(日志写入进程)和DBWn(数据写入进程)

  • 检查点(Checkpoint)

  • CKPT的作用与设计目标

    • 数据一致性:将内存中的脏块(Dirty Blocks)写入数据文件,确保数据文件与控制文件、重做日志的一致性。

    • 缩短恢复时间:实例崩溃时,数据库恢复只需处理最近一次检查点之后的Redo日志。

    • 减少I/O尖峰:将脏块刷盘操作分散到检查点的多次增量推进中,避免突发性大规模写入。

  • 检查点类型

    • 根据触发方式和应用场景,Oracle定义多种检查点类型:

    • 完全检查点(Full Checkpoint):

      • 触发:ALTER SYSTEM CHECKPOINT、关闭数据库(NORMAL/IMMEDIATE方式)。

      • 动作:DBWn将所有脏块写入数据文件,更新数据文件头和控制文件的SCN。

      • 特点:耗时久,常见于维护操作。

    • 增量检查点(Incremental Checkpoint):

      • 触发:定期触发(由参数控制),Redo Log切换,或根据 FAST_START_MTTR_TARGET 自动调节。

      • 动作:脏块按修改顺序(Checkpoint Queue)逐步写入磁盘,仅更新控制文件中检查点SCN(RBA)。

      • 特点:均衡I/O,默认模式。

    • 部分检查点(Partial Checkpoint):

      • 触发:针对特定操作(如表空间离线、数据文件收缩)。

      • 动作:仅刷写与操作相关的脏块。

  • CKPT的底层实现原理

    • 检查点的关键数据结构

      • 检查点队列(Checkpoint Queue):

        • 脏块按事务提交顺序(SCN)排列的链表,DBWn按顺序刷脏块。

        • RBA(Redo Block Address):记录检查点的截止位置(即脏块对应的最后Redo条目地址)。

        • 位图块(Bitmap Blocks):在检查点队列中标识已刷新的脏块。

      • SCN(System Change Number):

        • CKPT维护三个关键SCN:

        • Checkpoint SCN:控制文件中记录的当前检查点位置(表示所有更早SCN的修改已写入磁盘)。

        • On-Disk RBA:最后被DBWn刷盘的RBA。

        • Target RBA:根据 FAST_START_MTTR_TARGET 计算的目标RBA(用于控制恢复时间)。

    • 与DBWn进程的协作

      • 检查点触发DBWn的动作:

        • CKPT向DBWn发送需要刷新的脏块范围(基于RBA),DBWn异步写入对应的脏块。
      • 检查点推进条件:

        • 只有DBWn将指定RBA前的脏块完全写入后,CKPT才会更新Checkpoint SCN。
    • 与LGWR进程的协同

      • Redo日志切换触发检查点:

      • 每次切换日志组时,CKPT触发增量检查点以推进SCN,确保新日志组对应准确的恢复起点。

  • CKPT的完整工作流程

    • 以下以增量检查点为例说明流程:

    • 触发检查点:

      • 由参数FAST_START_MTTR_TARGET设置的恢复时间目标决定触发频率。

      • 当LGWR完成日志写入并触发日志切换时,CKPT接管检查点推进。

    • 确定增量范围:

      • CKPT读取当前Checkpoint Queue中的最低RBA(LRBA),将此前的脏块视为需写入的范围。
    • 调度DBWn刷盘:

      • CKPT向DBWn发送增量范围内的脏块信息,DBWn分批次将脏块写入数据文件。
    • 更新检查点信息:

      • DBWn每完成一批写入,CKPT将刷新后的RBA更新至控制文件。

      • CKPT并不会直接写文件头:完全检查点才会更新所有数据文件头的SCN,而增量检查点只更新控制文件中的检查点位置。

    • 恢复边界推进:

      • 实例崩溃恢复时,SMON进程只需重放最后一次检查点后的Redo日志,缩短恢复时间。
  • 总结

    • CKPT的本质作用:

      • 在性能与可靠性间寻求平衡,通过增量检查点机制最小化恢复时间,同时避免I/O压力激增。
    • 核心协作关系:

      • CKPT驱动DBWn刷脏块,协调LGWR的日志切换。

      • 增量检查点依赖Checkpoint Queue跟踪脏块刷新进度。

    • DBA的调优职责:

      • 根据业务场景调整FAST_START_MTTR_TARGET,监控检查点推进状态,确保数据库在崩溃后快速恢复且不影响事务处理性能。

      • 理解CKPT的实现细节对于设计高可用架构(如RAC、Data Guard)和优化OLTP系统有重要意义。例如,若系统有严格恢复时间要求(如金融交易系统),需精细控制FAST_START_MTTR_TARGET并验证恢复速度。