外观
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_servers和dispatchers参数 - 监控共享服务器的等待事件: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 进程故障:在归档模式下会导致数据库挂起
故障诊断命令
查看进程状态:
sqlSELECT program, status FROM v$process;查看进程等待事件:
sqlSELECT p.program, s.event, s.wait_time FROM v$process p, v$session s WHERE p.addr = s.paddr;查看进程资源使用情况:
sqlSELECT program, pga_used_mem, pga_alloc_mem, pga_max_mem FROM v$process;
故障处理方法
进程异常终止:
- 检查告警日志:
tail -f $ORACLE_BASE/diag/rdbms/orcl/ORCL/trace/alert_ORCL.log - 检查进程跟踪文件:在告警日志中查找跟踪文件路径
- 尝试重启数据库实例(如果必要)
- 检查告警日志:
进程挂起:
- 找出挂起的进程:
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; - 分析等待事件:
SELECT event, COUNT(*) FROM v$session_wait GROUP BY event ORDER BY 2 DESC; - 尝试终止挂起的会话:
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 应该根据实际业务需求选择合适的进程模式,合理配置进程相关参数,并定期监控进程状态和资源使用情况,以确保数据库的稳定高效运行。
