首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Oracle体系结构-PMON详解

Oracle体系结构-PMON详解

原创
作者头像
暮渔木鱼
修改2025-09-08 17:11:11
修改2025-09-08 17:11:11
1190
举报

一、 PMON 的设计目标与核心思想

  1. 确保实例稳定性 (Instance Stability):
    • 核心设计理念: 检测并自动清理因各种原因(用户进程异常终止、会话非正常断开、内部错误等)而失败的用户进程、服务器进程以及它们所占用的资源。
    • 解决的问题: 防止“僵shi”进程和“gu儿”资源(锁、PGA、事务状态、临时段等)长期滞留,导致资源耗尽、性能下降、甚至阻止其他正常进程运行(如死锁)。
  2. 维护资源一致性 (Resource Consistency):
    • 在进程失败后,回滚其未提交的事务,释放其持有的锁,清理其分配的 PGA 内存,回收其使用的临时段。
    • 解决的问题: 保证数据库事务的 ACID 属性(尤其是原子性和一致性)。确保资源(锁、内存、磁盘空间)能被及时回收供其他会话使用,防止数据处于不一致状态。
  3. 注册服务信息 (Service Registration - 历史职责,现主要由 LREG 承担):
    • 在较旧版本 (Oracle 10g R2 之前),PMON 负责向监听器 (Listener) 动态注册实例的服务信息(服务名、实例名、负载、状态等)。
    • 解决的问题: 使监听器知道哪些实例可用,并能将客户端连接请求路由到正确的实例和调度器(在共享服务器模式下)或直接启动专用服务器进程。
    • 演变: 从 Oracle 10g R2 开始,动态注册功能主要由专门的 LREG (Listener Registration) 进程承担,PMON 在必要时(如 LREG 失败)会接管此任务以确保高可用。
  4. 死锁检测与解决 (Deadlock Detection):
    • 定期扫描系统以检测死锁(多个会话相互等待对方持有的资源,形成循环等待,导致所有相关会话“卡死”)。
    • 解决的问题: 自动打破死锁僵局,允许部分事务继续进行,恢复系统可用性。这是维护系统高可用的关键机制。
  5. 高可用性与自愈能力 (High Availability & Self-Healing):
    • PMON 是 Oracle 数据库高可用性架构的重要组成部分。其自动化的失败检测和清理机制,使得单个会话或进程的失败不会轻易导致整个实例崩溃,数据库能够自我修复
    • 解决的问题: 提高数据库的鲁棒性和持续服务能力。

二、 PMON 的核心职责与工作原理

PMON 是一个持续运行的后台进程。它主要采用被动触发 + 主动轮询相结合的工作机制:

  1. 失败检测 (Failure Detection):
    • 被动触发 (主要机制):
      • 操作系统信号 (OS Signal): 当用户进程或专用服务器进程异常终止(如被 kill -9)时,操作系统内核会向 PMON 进程发送一个信号(通常是 SIGPIPE 或连接断开的信号),通知它有进程死亡。
      • 轮询连接状态 (Polling Connection Status): PMON 会周期性地检查服务器进程与其关联的用户进程(客户端)之间的通信管道/网络连接是否仍然存活。如果连接断开(例如,客户端网络故障、客户端进程崩溃、客户端非正常退出),PMON 会检测到并认为该会话已失败。
    • 主动轮询 (辅助机制): PMON 会定期(虽然间隔相对较长)扫描系统内部结构(如进程表),检查所有注册的进程是否仍然活跃。如果发现某个进程长时间无响应或状态异常,会将其标记为失败并进行清理。
  2. 资源清理与事务恢复 (Resource Cleanup & Transaction Recovery):
    • 一旦 PMON 确认一个进程(用户进程或专用服务器进程)失败:
      • 回滚事务 (Rollback Transaction): PMON 回滚该失败进程正在执行的任何未提交的事务。这是通过应用存储在回滚段(Undo Segments)中的撤销记录 (Undo Records) 来实现的。这保证了事务的原子性(Atomicity)—— 要么全做,要么全不做。数据库恢复到该事务开始前的状态。
      • 释放锁 (Release Locks): PMON 释放该失败进程持有的所有(行锁、表锁、TM锁、TX锁等)。这解除了对其他会话的阻塞,允许它们访问被锁定的资源。
      • 清理 PGA (Cleanup PGA): PMON 释放分配给该失败进程的 PGA 内存。这部分内存被标记为可重用,供新的服务器进程使用。
      • 回收临时段 (Reclaim Temp Segments): 如果失败进程在执行排序、哈希连接等操作时在临时表空间分配了临时段 (Temporary Segments),PMON 会负责回收这些磁盘空间。
      • 从活动列表中移除 (Remove from Active Lists): PMON 将该进程从 SGA 中的各种活动进程列表(如 V$SESSION, V$PROCESS)中移除。
      • 通知相关组件: 通知其他后台进程(如 DBWn, LGWR)关于该进程的终止。
  3. 死锁检测与解决 (Deadlock Detection & Resolution):
    • 机制: PMON 定期(通常是每几秒一次)启动一个死锁检测器 (Deadlock Detector)
    • 扫描: 检测器会扫描 SGA 中与锁相关的数据结构(如 enqueue 资源),构建一个等待图 (Wait-for Graph)。在这个图中,节点代表会话,边代表会话 A 等待会话 B 持有的资源。
    • 识别循环: 如果在图中发现循环 (Cycle),则判定发生了死锁。
    • 选择牺牲者 (Victim Selection): PMON 会根据一定的策略(通常选择回滚代价最小的会话,例如 UNDO 量最少的会话)选择一个会话作为“牺牲者”。
    • 解决死锁: PMON 回滚牺牲者会话的当前事务(或仅回滚导致死锁的那条语句),释放其持有的锁。这会打破死锁循环,允许其他被阻塞的会话继续执行。
    • 错误报告: 被选为牺牲者的会话会收到一个 ORA-00060: deadlock detected while waiting for resource 错误。应用程序需要处理此错误(通常重试事务)。
  4. 监听器注册 (Listener Registration - 历史与现代):
    • 历史 (Pre-10gR2): PMON 是负责动态注册的主要进程。它定期(默认每 60 秒)或实例状态改变时(启动、关闭、服务修改)连接监听器,发送 SERVICE_UPDATE 消息,告知实例信息。
    • 现代 (10gR2+): LREG (Listener Registration) 进程成为动态注册的主力。LREG 更轻量级,专门负责注册,减少了 PMON 的负担。
    • PMON 的兜底角色: 如果 LREG 进程自身失败,PMON 会检测到并尝试重启 LREG。如果重启失败,PMON 会临时接管 LREG 的注册职责,确保监听器信息不会过时,维持客户端连接能力。这是高可用设计的体现。

三、 PMON 的工作机制特点

  1. 低优先级 (Low Priority): PMON 通常以较低的优先级运行,避免影响前台用户进程和关键的后台进程(如 DBWn, LGWR, CKPT)。
  2. 事件驱动为主 (Event-Driven Primary): 其核心的失败清理工作主要由外部事件触发(进程死亡信号、连接断开检测)。
  3. 周期性轮询为辅 (Periodic Polling Secondary): 死锁检测和主动进程状态检查是周期性的。
  4. 原子性操作 (Atomic Operations): 清理操作(尤其是事务回滚)需要保证原子性,确保资源状态完全恢复到一致点。
  5. 依赖底层结构: PMON 严重依赖 SGA 中的共享内存结构(如锁管理器、进程表、事务表、回滚段头)来执行其检测和清理任务。

四、 监控 PMON

虽然 PMON 本身很少成为性能瓶颈,但监控其活动有助于了解系统健康状况和失败频率:

  1. 跟踪文件 (Trace Files):
    • PMON 在遇到需要清理的失败进程、检测到死锁或自身发生严重错误时,会向 ADR (Automatic Diagnostic Repository) 目录(通常是 $ORACLE_BASE/diag/rdbms/<dbname>/<instname>/trace)写入跟踪文件 (<instname>_pmon_<pid>.trc)。这些文件包含详细的错误信息和清理动作记录。是诊断 PMON 相关问题的首要位置。
  2. 告警日志 (Alert Log):
    • 重要的 PMON 活动会被记录到数据库告警日志 (alert_<instname>.log) 中,例如:
      • PMON started with pid=<pid>
      • ORA-00060: Deadlock detected. More info in file... (指向具体的跟踪文件)
      • 清理进程的日志(较少见,除非设置诊断事件)
      • LREG 失败并由 PMON 接管注册的日志。
  3. 动态性能视图 (V$ Views):
    • V$SESSION / V$PROCESS******:** 查看 PMON 进程本身的状态 (PROGRAM = 'PMON', BACKGROUND = 'PMON')。观察其 STATUS, LAST_CALL_ET (空闲时间) 等。
    • V$LOCK / V$ENQUEUE_STAT / V$SESSION_WAIT******:** 监控锁争用和死锁相关的等待事件 (enq: TX - row lock contention, enq: TM - contention, library cache lock/pin, cursor: pin S wait on X 等可能与死锁或阻塞相关)。死锁发生时,相关会话的等待事件会体现出来。
    • V$TRANSACTION******:** 查看当前活动事务。PMON 清理失败事务后,相应的事务记录会消失。
    • V$SYSSTAT******:** 查看系统统计信息:
      • user commits / user rollbacks: 正常提交和回滚。
      • transaction rollbacks****:** 关键指标! 记录所有回滚的事务数。user rollbacks** 是用户显式执行 ROLLBACK 的数量,而 transaction rollbacks 包含所有回滚,主要是由 PMON 在进程失败时自动触发的回滚。transaction rollbacks 减去 user rollbacks 可能指示较高的进程失败率。
      • deadlocks detected: PMON 检测到的死锁次数。
      • enqueue timeouts: 锁等待超时次数(与死锁不同)。
    • V$INSTANCE_RECOVERY******:** 查看实例恢复相关的统计,其中 PMON_CLEANED_COUNT 可能记录了 PMON 清理的进程数量(具体视图和统计项可能因版本而异)。
  4. 监听器状态 (**lsnrctl status**):
    • 检查监听器是否成功注册了实例的服务 (Services Summary... Instance "<instname>", status READY)。如果状态异常(如 UNKNOWN, BLOCKED),可能涉及 PMON/LREG 注册问题。

五、 PMON 的重要性与故障影响

  • 系统稳定性的基石: 没有 PMON 的自动清理机制,任何用户进程或会话的失败都会导致资源持久泄漏。系统会逐渐积累大量“僵shi”锁、未释放的内存和未完成的事务,最终导致资源耗尽(ORA-04030, ORA-00018)或严重阻塞,实例变得不可用或需要频繁重启。
  • 事务一致性的守护者: PMON 确保失败的事务被正确回滚,维护了数据库的 ACID 属性(原子性、一致性)。没有它,数据库可能处于不可预测的、损坏的状态。
  • 死锁的终结者: 自动死锁检测和解决是维持系统高可用的关键。否则,死锁会无限期挂起相关会话,需要 DBA 手动干预。
  • 连接路由的保障(历史/兜底): 虽然注册主要交给 LREG,但 PMON 的兜底机制确保了即使 LREG 失效,客户端也能(通过 PMON 的临时接管)连接到数据库,提供了额外的容错能力。

PMON 故障的后果极其严重:

  • 如果 PMON 进程本身崩溃 (Crash): Oracle 实例无法继续运行,会立即中止 (Abort)。因为 PMON 是核心的、不可替代的后台进程。实例必须重启。
  • 如果 PMON 工作异常 (Hang 或 Bug): 虽然实例可能不会立即崩溃,但失败进程和死锁将得不到及时清理,资源泄漏会不断累积。系统性能会急剧下降(严重的锁争用、内存不足),最终可能导致实例挂起或需要强制重启。告警日志和跟踪文件中会出现大量相关错误。

六、 总结

PMON (Process Monitor) 是 Oracle 数据库体系结构中不可或缺的核心后台进程,扮演着清道夫 (Cleaner)恢复协调员 (Recovery Coordinator)死锁终结者 (Deadlock Killer) 的关键角色。

  • 核心职责:
    1. 失败进程检测与清理: 自动检测异常终止的用户进程、服务器进程,释放其资源(PGA)、回滚其未提交事务、释放其持有的锁、回收临时段。
    2. 死锁检测与解决: 定期扫描并打破死锁循环,回滚牺牲者事务以恢复系统运行。
    3. 监听器注册兜底 (LREG 失效时): 确保实例服务信息能被客户端发现。
  • 设计目标:
    • 确保实例稳定性与自愈能力。
    • 维护事务的 ACID 属性(原子性、一致性)。
    • 保障系统资源(锁、内存、磁盘)的有效利用和释放。
    • 提升数据库高可用性 (High Availability)。
  • 工作机制:
    • 被动触发为主 (OS 信号、连接断开检测)。
    • 主动轮询为辅 (死锁检测、进程状态扫描)。
    • 依赖 SGA 共享结构进行状态管理和清理操作。
  • 监控关键点:
    • 告警日志 (Alert Log): 死锁记录、进程清理日志(罕见)、LREG/PMON 接管日志。
    • 跟踪文件 (Trace Files): 死锁详情、清理错误信息。
    • V$SYSSTAT******:** transaction rollbacks (对比 user rollbacks), deadlocks detected
    • V$SESSION / V$PROCESS******:** 锁争用等待事件、PMON 自身状态。
    • lsnrctl status******:** 实例服务注册状态。
  • 重要性:
    • PMON 失效意味着实例无法稳定运行。 其崩溃会导致实例立即中止;其功能异常会导致资源泄漏、性能恶化直至实例不可用。它是 Oracle 数据库高可用和自愈能力的核心引擎之一,默默地维护着数据库内部的秩序与健康。

理解 PMON 的运作原理,对于诊断会话异常断开后的锁遗留问题、分析死锁原因、排查实例不稳定因素以及深刻理解 Oracle 的故障恢复机制至关重要。它是 DBA 在维护数据库健壮性时必须掌握的核心后台进程知识。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、 PMON 的设计目标与核心思想
  • 二、 PMON 的核心职责与工作原理
  • 三、 PMON 的工作机制特点
  • 四、 监控 PMON
  • 五、 PMON 的重要性与故障影响
  • 六、 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档