Skip to content

Oracle 进程模型

Oracle 数据库由多个进程组成,这些进程协同工作以管理数据库的各种资源和操作。理解 Oracle 进程模型对于 DBA 进行性能调优、故障诊断和日常维护至关重要。

进程类型概述

Oracle 进程主要分为两大类:

后台进程

后台进程是 Oracle 数据库实例启动时自动创建的进程,负责维护数据库的正常运行。不同版本的 Oracle 后台进程有所差异,以下是常见的后台进程:

核心后台进程

  • PMON(进程监控器)

    • 职责:监控和管理用户进程,清理异常终止的进程资源
    • 版本差异:所有版本均存在,功能基本一致
    • 典型场景:当用户会话意外断开时,PMON 会释放该会话持有的锁和内存资源
    • 监控命令:SELECT * FROM v$process WHERE program LIKE '%PMON%';
  • SMON(系统监控器)

    • 职责:执行系统级别的清理和恢复操作
    • 版本差异:
      • Oracle 11g:支持自动实例恢复
      • Oracle 12c+:增强了对 PDB 的支持
    • 典型场景:数据库实例异常关闭后,SMON 在下次启动时执行实例恢复
    • 监控命令:SELECT * FROM v$process WHERE program LIKE '%SMON%';
  • DBWn(数据库写入器)

    • 职责:将脏缓冲区从 SGA 写入数据文件
    • 版本差异:
      • Oracle 11g:最多支持 36 个 DBWn 进程(DBW0-DBW9, DBWa-DBWz)
      • Oracle 12c+:支持自动调整 DBWn 进程数量
    • 典型场景:当脏缓冲区达到阈值或发生检查点时,DBWn 会执行写入操作
    • 监控命令:SELECT * FROM v$process WHERE program LIKE '%DBW%';
  • LGWR(日志写入器)

    • 职责:将 redo log 缓冲区的内容写入 redo log 文件
    • 版本差异:
      • Oracle 11g:支持快速提交和组提交
      • Oracle 12c+:增强了对多租户环境的支持
    • 典型场景:当发生提交操作、redo log 缓冲区达到 1/3 或每 3 秒时,LGWR 会执行写入操作
    • 监控命令:SELECT * FROM v$process WHERE program LIKE '%LGWR%';
  • CKPT(检查点进程)

    • 职责:触发检查点,更新数据文件和控制文件的检查点信息
    • 版本差异:所有版本均存在,功能基本一致
    • 典型场景:当发生日志切换或达到检查点时间间隔时,CKPT 会执行检查点操作
    • 监控命令:SELECT * FROM v$process WHERE program LIKE '%CKPT%';

可选后台进程

  • ARCH(归档进程)

    • 职责:将已填满的 redo log 文件归档到归档日志文件
    • 版本差异:
      • Oracle 11g:支持最多 30 个 ARCH 进程
      • Oracle 12c+:增强了对远程归档的支持
    • 典型场景:在归档模式下,当发生日志切换时,ARCH 会执行归档操作
    • 监控命令:SELECT * FROM v$process WHERE program LIKE '%ARCH%';
  • MMON(管理监控进程)

    • 职责:收集 AWR(自动工作负载仓库)统计信息
    • 版本差异:
      • Oracle 11g:引入 AWR 自动收集功能
      • Oracle 12c+:增强了对多租户环境的支持
    • 典型场景:每小时自动收集 AWR 快照
    • 监控命令:SELECT * FROM v$process WHERE program LIKE '%MMON%';
  • MMNL(管理监控轻量级进程)

    • 职责:将内存中的统计信息刷新到磁盘
    • 版本差异:Oracle 11g 及以上版本支持
    • 典型场景:当内存中的统计信息达到阈值时,MMNL 会执行刷新操作
    • 监控命令:SELECT * FROM v$process WHERE program LIKE '%MMNL%';

服务器进程

服务器进程是为处理用户请求而创建的进程,负责执行 SQL 语句和处理用户事务。

进程模式

  • 专用服务器模式(Dedicated Server)

    • 每个用户连接对应一个服务器进程
    • 优点:简单易管理,适合小型数据库
    • 缺点:资源消耗大,不适合大规模并发
    • 配置命令:ALTER SYSTEM SET dispatchers='';
  • 共享服务器模式(Shared Server)

    • 多个用户连接共享一个服务器进程
    • 优点:节省资源,适合大规模并发
    • 缺点:管理复杂,可能存在性能瓶颈
    • 配置命令:
      sql
      ALTER SYSTEM SET dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)';
      ALTER SYSTEM SET shared_servers=5;
      ALTER SYSTEM SET max_shared_servers=20;
  • Oracle 12c+ 多租户环境

    • 支持 CDB 和 PDB 级别的进程管理
    • 配置命令:
      sql
      ALTER SESSION SET CONTAINER = PDB1;
      ALTER SYSTEM SET processes=100 SCOPE=BOTH;

进程间通信

Oracle 进程间通过以下方式进行通信:

  • 共享内存(SGA):用于进程间共享数据和信息
  • 信号量(Semaphores):用于进程同步和资源控制
  • 管道(Pipes):用于进程间数据传输
  • Oracle Net Services:用于客户端与服务器之间的通信

进程与内存关系

  • SGA(系统全局区):由所有进程共享

    • 包含数据缓冲区、redo log 缓冲区、共享池等
    • 配置命令:ALTER SYSTEM SET sga_target=4G SCOPE=SPFILE;
  • PGA(程序全局区):每个服务器进程私有

    • 包含排序区、哈希区、会话内存等
    • 配置命令:
      sql
      ALTER SYSTEM SET pga_aggregate_target=2G SCOPE=SPFILE;
      ALTER SYSTEM SET workarea_size_policy=AUTO SCOPE=SPFILE;

进程管理最佳实践

专用服务器模式最佳实践

  • 适合并发连接数较少的环境(< 1000)
  • 确保服务器有足够的 CPU 和内存资源
  • 合理设置 processes 参数:
    sql
    -- 查看当前进程数
    SELECT COUNT(*) FROM v$process;
    
    -- 查看配置的进程数
    SELECT name, value FROM v$parameter WHERE name = 'processes';
    
    -- 修改进程数
    ALTER SYSTEM SET processes=500 SCOPE=SPFILE;

共享服务器模式最佳实践

  • 适合并发连接数较多的环境(> 1000)
  • 合理设置 shared_serversdispatchers 参数
  • 监控共享服务器的等待事件:
    sql
    SELECT event, COUNT(*) FROM v$session_wait GROUP BY event;

多租户环境最佳实践

  • 为每个 PDB 合理分配进程资源
  • 监控 CDB 和 PDB 级别的进程使用情况:
    sql
    -- CDB 级别进程数
    SELECT COUNT(*) FROM v$process;
    
    -- PDB 级别进程数
    ALTER SESSION SET CONTAINER = PDB1;
    SELECT COUNT(*) FROM v$process;

进程故障诊断与处理

常见进程故障

  • PMON 进程故障:可能导致进程泄漏和资源耗尽
  • LGWR 进程故障:会导致数据库实例崩溃
  • DBWn 进程故障:可能导致数据库挂起
  • ARCH 进程故障:在归档模式下会导致数据库挂起

故障诊断命令

  • 查看进程状态:

    sql
    SELECT program, status FROM v$process;
  • 查看进程等待事件:

    sql
    SELECT p.program, s.event, s.wait_time FROM v$process p, v$session s WHERE p.addr = s.paddr;
  • 查看进程资源使用情况:

    sql
    SELECT program, pga_used_mem, pga_alloc_mem, pga_max_mem FROM v$process;

故障处理方法

  • 进程异常终止

    1. 检查告警日志:tail -f $ORACLE_BASE/diag/rdbms/orcl/ORCL/trace/alert_ORCL.log
    2. 检查进程跟踪文件:在告警日志中查找跟踪文件路径
    3. 尝试重启数据库实例(如果必要)
  • 进程挂起

    1. 找出挂起的进程:SELECT p.spid, s.sid, s.serial#, s.program FROM v$process p, v$session s WHERE p.addr = s.paddr AND s.status = 'ACTIVE' AND s.wait_time = 0;
    2. 分析等待事件:SELECT event, COUNT(*) FROM v$session_wait GROUP BY event ORDER BY 2 DESC;
    3. 尝试终止挂起的会话:ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

版本差异

版本进程模型特性
Oracle 11g引入 MMON 和 MMNL 进程,支持自动 AWR 收集
Oracle 12c增强多租户环境的进程管理,支持 PDB 级别的进程配置
Oracle 19c优化了进程调度算法,提高了并发性能
Oracle 23c引入了新的进程管理机制,支持更细粒度的资源控制

常见问题(FAQ)

Q1: 如何确定数据库使用的是专用服务器还是共享服务器模式?

A1: 可以通过以下命令查看:

sql
SELECT server FROM v$session WHERE sid = SYS_CONTEXT('USERENV', 'SID');
-- 结果为 'DEDICATED' 表示专用服务器,'SHARED' 表示共享服务器

Q2: 如何调整 Oracle 数据库的最大进程数?

A2: 可以通过以下命令调整:

sql
-- 查看当前配置
SELECT name, value FROM v$parameter WHERE name = 'processes';

-- 修改配置(需要重启数据库)
ALTER SYSTEM SET processes=500 SCOPE=SPFILE;

Q3: 后台进程异常终止会导致什么后果?

A3: 不同后台进程异常终止的后果不同:

  • PMON、SMON、CKPT:可能导致资源泄漏,需要重启数据库
  • DBWn:可能导致数据库挂起
  • LGWR:会导致数据库实例崩溃
  • ARCH:在归档模式下会导致数据库挂起

Q4: 如何监控 Oracle 进程的资源使用情况?

A4: 可以通过以下命令监控:

sql
-- 查看进程内存使用情况
SELECT program, pga_used_mem/1024/1024 AS pga_used_mb, pga_alloc_mem/1024/1024 AS pga_alloc_mb FROM v$process ORDER BY pga_used_mem DESC;

-- 查看进程 CPU 使用情况
SELECT p.spid, s.username, s.program, p.cpu_time/1000000 AS cpu_sec FROM v$process p, v$session s WHERE p.addr = s.paddr ORDER BY p.cpu_time DESC;

Q5: 共享服务器模式下如何调整调度进程数量?

A5: 可以通过以下命令调整:

sql
-- 查看当前配置
SELECT name, value FROM v$parameter WHERE name IN ('dispatchers', 'shared_servers', 'max_shared_servers');

-- 修改配置
ALTER SYSTEM SET dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB) (DISPATCHERS=3)';
ALTER SYSTEM SET shared_servers=10;
ALTER SYSTEM SET max_shared_servers=30;

Q6: Oracle 19c 中进程模型有哪些改进?

A6: Oracle 19c 中进程模型的主要改进包括:

  • 优化了进程调度算法,提高了并发性能
  • 增强了对大内存系统的支持
  • 改进了进程异常处理机制
  • 优化了共享服务器模式的性能

相关命令速查

命令用途
SELECT * FROM v$process;查看所有进程信息
SELECT * FROM v$bgprocess;查看后台进程信息
SELECT * FROM v$session;查看会话信息
ALTER SYSTEM SET processes=500 SCOPE=SPFILE;修改最大进程数
ALTER SYSTEM SET shared_servers=5;设置共享服务器数量
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;终止会话
SHOW PARAMETER processes;查看进程相关参数

总结

Oracle 进程模型是数据库架构的重要组成部分,理解进程模型对于 DBA 进行日常运维、性能调优和故障诊断至关重要。DBA 应该根据实际业务需求选择合适的进程模式,合理配置进程相关参数,并定期监控进程状态和资源使用情况,以确保数据库的稳定高效运行。