Oracle 后台进程详解:SMON / PMON / DBWn / LGWR / CKPT / ARCn
Oracle 后台进程详解:SMON / PMON / DBWn / LGWR / CKPT / ARCn
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Oracle 后台进程是实例的核心,各自承担特定职责[1]:
| 进程 | 作用 |
|---|---|
| PMON | 进程监视 |
| SMON | 系统监视 |
| DBWn | 数据库写进程 |
| LGWR | 日志写进程 |
| CKPT | 检查点进程 |
| ARCn | 归档进程 |
| MMON/MMNL | AWR 采集 |
| RECO | 分布式事务恢复 |
2. PMON(Process Monitor)
2.1 职责
- 监控其他进程
- 清理异常终止的进程资源
- 重启死亡的后台进程
- 注册实例到监听器
2.2 触发场景
用户进程异常终止 → PMON 检测到 → 执行清理:
1. 回滚未提交事务
2. 释放锁资源
3. 释放 PGA 内存
4. 释放其他资源(如临时段)
2.3 监听器注册
PMON 每分钟自动向监听器注册实例信息:
# 查看监听器中的服务
lsnrctl status
# Services Summary...
# Service "orcl" has 1 instance(s).
# Instance "orcl", status READY, has 1 handler(s) for this service...
3. SMON(System Monitor)
3.1 职责
- 实例恢复(前滚 + 回滚)
- 合并空闲空间(Dictionary-managed 表空间)
- 清理临时段
- 维护 Undo 段
3.2 实例恢复
异常重启 → SMON 执行:
1. 前滚(Redo 应用):从 Checkpoint RBA 重做 Redo
2. 打开数据库
3. 后台回滚未提交事务(使用 Undo)
3.3 空间合并
仅对 Dictionary-managed 表空间有效:
-- 查看 SMON 是否在合并空间
SELECT name, value
FROM v$sysstat
WHERE name = 'SMON posted';
-- 关闭 SMON 空间合并(不推荐)
ALTER SYSTEM SET smon_max_rowcache_cleanup=0 SCOPE=BOTH;
3.4 临时段清理
-- 查看临时段
SELECT
tablespace_name,
SUM(bytes)/1024/1024 AS mb
FROM dba_segments
WHERE segment_type='TEMPORARY'
GROUP BY tablespace_name;
4. DBWn(Database Writer)
4.1 职责
将 Buffer Cache 中的脏块写入数据文件[2]。
4.2 触发条件
- 每 3 秒
- 检查点触发
- LRU 链表扫描时遇到脏块
- Buffer Cache 空闲空间不足
- 表空间 OFFLINE / READ ONLY
- 数据库关闭(非 ABORT)
- DROP / TRUNCATE 操作
- RAC Ping 写
4.3 进程数配置
SHOW PARAMETER db_writer_processes;
-- 默认 1,最大 CPU_COUNT / 8
-- 调整
ALTER SYSTEM SET db_writer_processes=4 SCOPE=SPFILE;
-- 重启生效
4.4 写入策略
1. 扫描 LRU-W(脏块链表)
2. 收集脏块批次
3. 多块写(batch write)到数据文件
4. 完成后将块移回 LRU 主链表
详细内容见:Oracle 检查点 Checkpoint 机制详解。
5. LGWR(Log Writer)
5.1 职责
将 Redo Log Buffer 写入 Redo Log 文件。
5.2 触发条件
- 每 3 秒
- 用户 COMMIT
- Redo Log Buffer 1/3 满(或 1MB)
- DBWn 写脏块前(WAL)
- 日志切换
5.3 COMMIT 流程
用户 COMMIT:
1. LGWR 收到通知
2. 将 Redo Log Buffer 写入 Redo Log 文件
3. 等待 I/O 完成
4. 通知用户 COMMIT 成功
5. 释放事务锁
→ COMMIT 延迟 = LGWR 写盘时间
详细内容见:Oracle Redo Log Buffer 与 LGWR 写入策略。
6. CKPT(Checkpoint Process)
6.1 职责
- 更新控制文件中的检查点信息
- 更新数据文件头 SCN
- 通知 DBWn 写脏块
- 每 3 秒心跳推进
6.2 触发条件
- 每 3 秒(自动)
- 日志切换
- 完全检查点(SHUTDOWN IMMEDIATE 等)
- 表空间 OFFLINE
- DROP TABLESPACE
- TRUNCATE TABLE
6.3 CKPT 不写数据块
重要:CKPT 本身不写数据块,只更新元数据。写脏块的工作由 DBWn 完成。
详细内容见:Oracle 检查点 Checkpoint 机制详解。
7. ARCn(Archiver)
7.1 职责
复制已写满的 Redo Log 到归档目的地。
7.2 触发
- 日志切换时
- 自动启动(归档模式下)
7.3 进程数
SHOW PARAMETER log_archive_max_processes;
-- 默认 4,最大 30
ALTER SYSTEM SET log_archive_max_processes=8 SCOPE=BOTH;
7.4 归档目的地
SHOW PARAMETER log_archive_dest;
-- log_archive_dest_1 ... log_archive_dest_31
-- 配置归档
ALTER SYSTEM SET log_archive_dest_1='LOCATION=/u02/archive' SCOPE=BOTH;
ALTER SYSTEM SET log_archive_dest_2='SERVICE=stdby' SCOPE=BOTH;
详细内容见:Oracle 归档日志 Archive Log 与归档模式。
8. MMON / MMNL
8.1 职责
- MMON(Manageability Monitor):AWR 数据采集
- MMNL:内存到磁盘的 AWR 数据刷写
8.2 工作机制
MMON:
- 每小时自动生成 AWR 快照
- 自动收集指标
- 触发 ADDM
MMNL:
- ASH 数据采集
- 当 ASH buffer 满时刷写到 AWR
8.3 配置
-- AWR 间隔(默认 60 分钟)
ALTER SYSTEM SET statistics_level=TYPICAL SCOPE=BOTH;
-- TYPICAL: 默认采集
-- ALL: 全部采集(开销大)
-- BASIC: 关闭 AWR
-- 修改快照保留
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(
retention => 30*24*60, -- 30 天
interval => 60 -- 60 分钟
);
9. RECO(Recoverer Process)
9.1 职责
自动恢复分布式事务。
9.2 触发
分布式事务中部分节点故障 → RECO 自动:
1. 定期尝试连接故障节点
2. 节点恢复后,提交或回滚悬挂事务
3. 清理 dba_2pc_pending 视图
9.3 查看
-- 查看悬挂事务
SELECT local_tran_id, global_tran_id, state, mixed
FROM dba_2pc_pending;
-- 强制提交/回滚
EXEC DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('local_tran_id');
COMMIT;
10. 其他后台进程
| 进程 | 作用 |
|---|---|
| LREG | Listener Registration,注册服务到监听器(12c+) |
| CJQn | Job Queue Coordinator,调度任务 |
| Jnnn | Job Queue Slave,执行任务 |
| QMNC/Qnnn | AQ Coordinator/Slave,高级队列 |
| DBRM | Resource Manager |
| Wnnn | Space Management Worker,自动空间管理 |
| FBDA | Flashback Data Archiver |
| SMCO | Space Management Coordinator |
| ARCn | 归档进程 |
11. 后台进程视图
-- 所有后台进程
SELECT
name,
description,
pid,
spid
FROM v$bgprocess
WHERE paddr <> '00'
ORDER BY name;
-- 进程详情
SELECT
pid,
spid,
program,
background
FROM v$process
WHERE background = 1;
-- 等待事件
SELECT
s.sid,
s.program,
sw.event,
sw.wait_time,
sw.seconds_in_wait
FROM v$session s
JOIN v$session_wait sw ON s.sid = sw.sid
WHERE s.type = 'BACKGROUND';
12. 常见坑与排错
12.1 后台进程死亡
现象:alert log 报 ORA-00470: LGWR process terminated with error。
原因:后台进程异常终止(如 OS OOM)。
修复:
# 检查 OS 日志
dmesg | grep -i "out of memory"
# 或 /var/log/messages
# 检查 alert log 中的具体错误
tail -100 $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/alert_orcl.log
# 通常需要重启实例
sqlplus / as sysdba
SHUTDOWN ABORT;
STARTUP;
12.2 DBWn 写入慢
现象:write complete waits、free buffer waits 等待严重。
修复:
-- 增加 DBWn 进程
ALTER SYSTEM SET db_writer_processes=4 SCOPE=SPFILE;
-- 优化 I/O(使用 SSD/ASM)
12.3 LGWR 写入慢
现象:log file sync 等待严重。
修复:
-- 优化 Redo Log 存储(SSD)
-- 检查 Redo Log 大小
SELECT group#, bytes/1024/1024 AS mb FROM v$log;
-- 调整 Redo Log 大小(每小时切换 3-5 次)
12.4 ARCn 跟不上
现象:ORA-00257: archiver error。
修复:
-- 1. 增加归档进程数
ALTER SYSTEM SET log_archive_max_processes=8 SCOPE=BOTH;
-- 2. 检查归档目录空间
df -h /u02/archive
-- 3. 备份并清理旧归档
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
12.5 MMON 不工作
现象:AWR 快照不生成。
排查:
-- 检查参数
SHOW PARAMETER statistics_level;
-- 检查 MMON 进程
SELECT name, status FROM v$bgprocess WHERE name = 'MMON';
-- 手动触发快照
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT;
13. 最佳实践
- 监控后台进程状态:
v$bgprocess - DBWn 数量匹配负载:CPU/8,写密集场景适当增加
- Redo Log 快速存储:SSD/NVMe
- 归档空间充足:至少 3-7 天归档保留
- statistics_level=TYPICAL:保证 AWR 采集
- 监控 alert log:及时发现后台进程错误
- 避免 OOM:合理设置内存,预留 OS 余量
- 使用 systemd 管理 Oracle:自动重启进程
14. 参考资料
[1] Oracle Database Concepts 19c, “Background Processes” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/process-architecture.html
[2] Oracle Database Administrator’s Guide 19c, “Managing Background Processes” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-processes.html