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/MMNLAWR 采集
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. 其他后台进程

进程作用
LREGListener Registration,注册服务到监听器(12c+)
CJQnJob Queue Coordinator,调度任务
JnnnJob Queue Slave,执行任务
QMNC/QnnnAQ Coordinator/Slave,高级队列
DBRMResource Manager
WnnnSpace Management Worker,自动空间管理
FBDAFlashback Data Archiver
SMCOSpace 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 waitsfree 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. 最佳实践

  1. 监控后台进程状态v$bgprocess
  2. DBWn 数量匹配负载:CPU/8,写密集场景适当增加
  3. Redo Log 快速存储:SSD/NVMe
  4. 归档空间充足:至少 3-7 天归档保留
  5. statistics_level=TYPICAL:保证 AWR 采集
  6. 监控 alert log:及时发现后台进程错误
  7. 避免 OOM:合理设置内存,预留 OS 余量
  8. 使用 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