上一篇【第14篇】Oracle内存结构管理——SGA详解与调优实战
下一篇【第16篇】# Oracle连接模式与内存管理——专用服务器、共享服务器与AMM(明日更新,敬请期待)
摘要
本文系统讲解Oracle数据库的后台进程体系,重点解析六个核心后台进程(DBWR、LGWR、CKPT、SMON、PMON、ARCH)的工作机制、触发条件、性能影响和故障诊断方法,并介绍Oracle 11g引入的多线程架构变化。
一、后台进程总览
Oracle实例通过一组后台进程(Background Processes)完成数据库的各种维护工作。这些进程在数据库实例启动时自动启动,在后台默默运行,是Oracle自我管理的核心机制。
-- 查看当前运行的后台进程SELECTp.spidAS"OS进程ID",p.programAS"程序名",p.backgroundAS"是否后台"FROMv$process pWHEREp.background=1ORDERBYp.program;-- 查看后台进程说明SELECTpname,descriptionFROMv$bgprocessWHEREpaddr!='00'ORDERBYpname;二、DBWR——数据库写进程
2.1 职责与工作机制
DBWR(Database Writer Process,数据库写进程)负责将SGA缓冲区缓存中的脏缓冲区(已修改但未写入磁盘的数据块)异步写入数据文件。
DBWR触发条件(满足任一即触发写操作):
- 需要读入新的数据块,但空闲缓冲区不足
- CKPT(检查点进程)触发检查点操作
- 每隔3秒的超时机制
- 表空间脱机(OFFLINE)或只读(READ ONLY)前
- 表空间COALESCE或BEGIN BACKUP操作前
-- 监控DBWR的写入活动SELECTname,valueFROMv$sysstatWHEREnameIN('db block changes',-- 修改的块数'physical writes',-- 物理写次数'DBWR checkpoints',-- 检查点触发的写'DBWR buffers scanned',-- 扫描的缓冲区数'DBWR lru scans'-- LRU链表扫描次数);-- 查看DBWR等待事件SELECTevent,total_waits,total_timeouts,time_waitedFROMv$system_eventWHEREeventLIKE'db file%write%'ORDERBYtime_waitedDESC;2.2 多个DBWR进程
对于I/O密集型系统,可以配置多个DBWR进程:
-- 查看DBWR进程数配置SHOWPARAMETER db_writer_processes-- 增加DBWR进程数(最多20个,一般设置为CPU数的1/8到1/4)ALTERSYSTEMSETdb_writer_processes=4SCOPE=SPFILE;-- 注意:该参数需要重启数据库才生效-- 查看多个DBWR进程的状态SELECTname,programFROMv$processWHEREprogramLIKE'%DBW%';三、LGWR——日志写进程
3.1 职责与工作机制
LGWR(Log Writer Process,日志写进程)将重做日志缓冲区的内容写入在线重做日志文件,是保证事务持久性的核心进程。
LGWR触发条件:
- 事务提交(COMMIT):最重要的触发条件,用户必须等待LGWR写完才能收到提交确认
- 重做日志缓冲区使用超过1/3
- 重做日志缓冲区中的内容超过1MB
- DBWR准备写脏缓冲区之前(写数据文件前必须先写日志,WAL协议)
- 每隔3秒的超时
-- 监控LGWR性能SELECTname,valueFROMv$sysstatWHEREnameIN('redo entries',-- 重做条目数'redo size',-- 重做日志总量(字节)'redo writes',-- LGWR写次数'redo write time',-- LGWR写入耗时(1/100秒)'redo log space requests',-- 等待日志空间次数'redo synch writes'-- 同步写(COMMIT触发)次数);-- 计算每次COMMIT的平均日志量SELECTROUND(s1.value/DECODE(s2.value,0,1,s2.value),2)ASbytes_per_commitFROMv$sysstat s1,v$sysstat s2WHEREs1.name='redo size'ANDs2.name='user commits';-- 查看LGWR等待事件SELECTevent,total_waits,time_waited/100ASwait_secsFROMv$system_eventWHEREeventLIKE'log file%'ORDERBYtime_waitedDESC;四、CKPT——检查点进程
4.1 检查点的概念
检查点(Checkpoint)是一个重要的数据库事件,其作用是:
- 通知DBWR将脏缓冲区写入磁盘
- 更新控制文件和数据文件头,记录"检查点SCN"
- 缩短实例恢复时间(恢复只需从最后一个检查点的SCN开始)
-- 查看当前检查点信息SELECTcheckpoint_change#, archived_seq#FROMv$database;-- 手动触发检查点(一般不需要,了解即可)ALTERSYSTEMCHECKPOINT;-- 全局检查点ALTERSYSTEMCHECKPOINTLOCAL;-- 本地检查点(RAC环境)-- 监控检查点活动SELECTname,valueFROMv$sysstatWHEREnameIN('background checkpoints completed','background checkpoints started','DBWR checkpoints');-- 检查点相关参数SHOWPARAMETER fast_start_mttr_target-- 目标MTTR(Mean Time To Recover),秒SHOWPARAMETER log_checkpoint_interval-- 按重做日志块数触发检查点SHOWPARAMETER log_checkpoint_timeout-- 按时间触发检查点(秒)-- 优化建议:设置fast_start_mttr_target(推荐,Oracle 10g+)-- 设置后Oracle自动调整检查点频率以满足恢复时间目标ALTERSYSTEMSETfast_start_mttr_target=60;-- 目标恢复时间60秒五、SMON——系统监控进程
SMON(System Monitor Process,系统监控进程)负责:
- 实例恢复:数据库异常关闭后的前滚和回滚操作
- 临时段清理:清理不再需要的临时段(如失败的SORT操作遗留的临时段)
- 字典管理表空间合并:合并相邻的空闲区(仅字典管理表空间)
- 事务恢复:恢复离线数据文件上的死事务
-- SMON的活动可以通过以下视图监控SELECTUNDOBLKS,TXNCOUNTFROMv$undostatORDERBYbegin_timeDESC;-- 查看实例恢复信息SELECT*FROMv$instance_recovery;-- SMON清理临时段(由Oracle自动完成,DBA无需干预)-- 但可以监控临时段的状态SELECTtablespace_name,bytes/1024/1024ASmb,statusFROMdba_temp_files;六、PMON——进程监控进程
PMON(Process Monitor Process,进程监控进程)负责:
- 清理失败进程:当用户进程异常中断时,PMON负责回滚未提交事务、释放锁、释放内存资源
- 注册实例信息:向Oracle Listener注册数据库实例(动态服务注册)
- 监控调度进程:在共享服务器模式下管理调度进程
-- 查看PMON的活动-- PMON发现的失败进程会触发相应的清理,可通过告警日志查看:-- $ORACLE_BASE/diag/rdbms/<db_name>/<instance_name>/trace/alert_<SID>.log-- 查看当前活跃会话(PMON监控这些进程)SELECTsid,serial#, username, status, program, machine, osuserFROMv$sessionWHEREusernameISNOTNULLORDERBYlogon_time;-- PMON相关等待事件SELECTevent,total_waitsFROMv$system_eventWHEREeventLIKE'pmon%';七、ARCH——归档进程
ARCH(Archiver Process,归档进程)在数据库处于归档模式时运行,负责将已写满的在线重做日志文件复制到归档位置。
-- 查看数据库的归档模式SELECTlog_modeFROMv$database;-- LOG_MODE = ARCHIVELOG(归档模式)-- LOG_MODE = NOARCHIVELOG(非归档模式)-- 切换归档模式(需要MOUNT状态,需要SYSDBA权限)-- 1. 关闭数据库到MOUNT状态SHUTDOWNIMMEDIATE;STARTUP MOUNT;-- 2. 切换到归档模式ALTERDATABASEARCHIVELOG;-- 3. 打开数据库ALTERDATABASEOPEN;-- 切换回非归档模式(会丢失备份能力,生产环境慎用!)-- ALTER DATABASE NOARCHIVELOG;-- 查看归档日志配置SHOWPARAMETER log_archive_destSHOWPARAMETER log_archive_formatSHOWPARAMETER log_archive_max_processes-- 查看最近的归档日志SELECTsequence#, name, blocks * block_size / 1024 / 1024 AS mb,TO_CHAR(first_time,'YYYY-MM-DD HH24:MI:SS')ASfirst_timeFROMv$archived_logWHEREstandby_dest='NO'ORDERBYsequence# DESC;-- 手动切换在线日志(触发归档)ALTERSYSTEM SWITCH LOGFILE;ALTERSYSTEM ARCHIVE LOGALL;-- 归档所有未归档的日志-- 配置多个归档位置(提高可靠性)ALTERSYSTEMSETlog_archive_dest_1='LOCATION=/archive1/ MANDATORY';ALTERSYSTEMSETlog_archive_dest_2='LOCATION=/archive2/ OPTIONAL';ALTERSYSTEMSETlog_archive_min_succeed_dest=1;-- 至少1个位置成功才允许覆盖日志八、其他重要后台进程
-- MMON(Manageability Monitor):收集AWR统计数据、生成告警-- MMNL(Manageability Monitor Lite):将内存中的统计数据刷新到AWR-- RECO(Recoverer Process):分布式事务的自动恢复-- CJQ0(Job Queue Coordinator):管理定时任务-- QMN0(Queue Monitor Process):管理Oracle高级队列-- 查看是否启用了MMON(AWR相关)SHOWPARAMETER statistics_level-- 需要TYPICAL或ALL级别才收集AWR-- 查看AWR快照设置SELECTsnap_interval,retentionFROMdba_hist_wr_control;-- 默认:每小时收集一次,保留8天-- 手动触发AWR快照BEGINDBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();END;/九、后台进程故障诊断
-- 查看告警日志中的后台进程错误-- 告警日志位置SELECTvalueASalert_log_dirFROMv$diag_infoWHEREname='Diag Trace';-- 通过视图查看告警日志内容(Oracle 11g+)SELECToriginating_timestamp,message_textFROMv$diag_alert_extWHEREmessage_textLIKE'%ORA-%'ANDoriginating_timestamp>SYSDATE-1ORDERBYoriginating_timestampDESC;-- 查看后台进程相关的等待事件SELECTevent,total_waits,total_timeouts,ROUND(time_waited/100,2)ASwait_secs,ROUND(average_wait/100,4)ASavg_wait_secsFROMv$system_eventWHEREeventIN('db file write','log file write','log file switch (checkpoint incomplete)','log file switch (archiving needed)','checkpoint completed')ORDERBYtime_waitedDESC;十、最佳实践
- 使用归档模式:生产数据库必须在ARCHIVE LOG模式下运行,支持完全恢复
- 设置MTTR目标:使用fast_start_mttr_target控制实例恢复时间
- 监控LGWR等待:
log file sync等待时间长表明LGWR性能瓶颈,考虑使用更快的磁盘 - 合理配置DBWR进程数:对于I/O密集型系统,增加DBWR进程数提高写吞吐量
- 定期检查告警日志:后台进程的异常首先反映在告警日志中
十一、总结
本文系统讲解了Oracle六大核心后台进程:
- DBWR:异步将脏缓冲区写入数据文件,可配置多个实例
- LGWR:同步写重做日志,是事务持久性保证的关键
- CKPT:触发检查点,缩短实例恢复时间
- SMON:实例恢复、临时段清理
- PMON:清理失败进程,服务动态注册
- ARCH:归档在线日志,支持完全恢复
后台进程的协同工作确保了Oracle数据库的高可靠性、高性能和自我修复能力。
上一篇【第14篇】Oracle内存结构管理——SGA详解与调优实战
下一篇【第16篇】# Oracle连接模式与内存管理——专用服务器、共享服务器与AMM(明日更新,敬请期待)
参考资料
- 《Oracle 11g数据库管理员指南》— 刘宪军著
- Oracle官方文档:Database Concepts - Process Architecture