一、LGWR的核心定位与使命
定义
LGWR(Log Writer)是Oracle数据库的核心后台进程,负责将重做日志缓冲区(Redo Log Buffer)中的内容写入在线重做日志文件(Online Redo Log Files)。核心使命
- 保障事务持久性(Durability):确保已提交事务的变更永不丢失。
- 支持崩溃恢复(Crash Recovery):数据库异常关闭后,通过重做日志重演事务。
- 维持日志完整性:按顺序写入日志,构建数据库操作的完整时间线。
二、工作原理与写入机制
1. 数据流转路径
graph LR
A[用户事务DML] --> B[生成Redo记录]
B --> C[写入Redo Log Buffer]
C --> D[LGWR进程]
D --> E[写入Online Redo Log Files]
2. LGWR触发条件
LGWR在以下任一条件满足时立即启动:
| 触发条件 | 原理说明 |
|---|---|
| 事务提交(COMMIT) | 强制将当前事务的Redo记录写入磁盘,确保事务持久性。 |
| Redo Log Buffer达到1/3满 | 防止缓冲区溢出,维持写入吞吐量。 |
| DBWn(数据写进程)触发 | DBWn写脏块前需确保相关Redo已落盘(Write-Ahead Logging, WAL原则)。 |
| 每3秒超时(Timeout) | 周期性刷新缓冲区,避免日志延迟。 |
| 日志切换(Log Switch) | 切换日志文件前需确保当前日志文件完全写入。 |
3. 写入流程详解
- 锁定日志缓冲区
LGWR锁定待写入的缓冲区区域(避免用户进程同时修改)。 - 批量写入日志文件
以连续顺序将多个Redo记录一次性写入日志文件(减少I/O次数)。 - 更新控制信息
- 在日志文件头记录检查点位置(Checkpoint Position)。
- 更新控制文件中的日志序列号(Log Sequence Number)。
- 释放缓冲区空间
标记缓冲区区域可复用,通知等待事务提交完成。
三、核心特性
顺序写入(Sequential Write)
- 按事务发生顺序写入日志文件,最大化磁盘I/O效率(对比DBWn的随机写)。
异步I/O(Asynchronous I/O)
- 使用
DISK_ASYNCH_IO参数启用异步I/O,提升并发性能(需OS支持)。
- 使用
组提交(Group Commit)
- 合并多个事务提交请求,一次性写入日志文件,减少I/O次数。
并行写入(Parallel Write)
- 在多日志组配置下,可并行写入不同日志文件(需
LOG_PARALLELISM>1)。
- 在多日志组配置下,可并行写入不同日志文件(需
实时同步(Real-Time Apply)
- Data Guard中启用
REALTIME_APPLY时,LGWR直接发送Redo到备库(12c+)。
- Data Guard中启用
四、关键作用
事务持久化保证
COMMIT; -- 触发LGWR写日志,事务永久生效崩溃恢复基石
- 异常关闭后重启时,SMON进程使用Redo日志前滚恢复(Roll Forward)。
支持在线备份
ALTER DATABASE BEGIN BACKUP; -- 备份期间Redo日志记录所有块变更日志挖掘基础
- LogMiner依赖Redo日志解析历史变更。
高可用架构核心
- Data Guard / GoldenGate 通过传输Redo日志实现数据同步。
五、性能调优与监控
1. 关键性能指标
| 指标 | 查看视图 | 健康阈值 | 异常影响 |
|---|---|---|---|
| log file sync | V$SESSION_WAIT |
平均等待时间 < 5ms | 提交延迟 |
| log file parallel write | V$SYSTEM_EVENT |
平均等待时间 < 10ms | LGWR写入性能瓶颈 |
| Redo Log Buffer大小 | V$SGASTAT |
无"redo buffer allocation retries" | 缓冲区过小 |
| 日志切换频率 | V$LOG_HISTORY |
< 20次/小时 | 日志文件过小 |
2. 调优参数
| 参数 | 默认值 | 调优建议 |
|---|---|---|
LOG_BUFFER |
通常为几MB | 增大至几十MB(避免retries出现) |
LOG_ARCHIVE_DEST_n |
- | 设置ASYNC或AFFIRM平衡性能与安全 |
LOG_FILE_SIZE |
通常100MB-1G | 根据每小时日志生成量调整(避免频繁切换) |
_LOG_PARALLELISM |
1(隐含参数) | 多CPU系统可设为2-4(需测试) |
3. 优化场景
高并发提交延迟(log file sync等待高)
解决方案:- 启用异步提交(
COMMIT WRITE BATCH NOWAIT)。 - 将日志文件放在低延迟存储(如NVMe SSD)。
- 使用批量提交减少提交次数。
- 启用异步提交(
LGWR写入慢(log file parallel write等待高)
解决方案:- 分离日志文件到独立磁盘(避免I/O竞争)。
- 启用异步I/O(
DISK_ASYNCH_IO=TRUE)。 - 增加日志文件大小减少切换频率。
六、故障处理与高可用设计
1. 典型故障场景
| 故障现象 | 原因分析 | 解决方案 |
|---|---|---|
| ORA-00257: archiver error | 归档日志满(LGWR无法切换日志) | 清理归档日志或增加DB_RECOVERY_FILE_DEST_SIZE |
| ORA-00312: redo log lost | 日志文件损坏或丢失 | 从备份恢复或CLEAR UNARCHIVED LOGFILE |
| LGWR进程僵死(Hang) | I/O阻塞或资源竞争 | 使用oradebug跟踪,重启实例 |
2. 高可用设计
- 多路复用日志文件(Multiplexing)
ALTER DATABASE ADD LOGFILE MEMBER '/disk2/redo01b.log' TO GROUP 1; -- 同一组日志多副本 - 日志文件组轮换(Log Switching)
- 至少配置3组日志文件,避免恢复中断。
- 快速故障转移(Fast Failover)
- RAC中一个节点LGWR故障,其他节点接管日志写入。
七、与相关进程的协作
| 进程 | 协作机制 |
|---|---|
| DBWn | LGWR先写Redo,DBWn再写数据块(WAL原则)。 |
| ARCn | LGWR完成日志切换后,通知ARCn归档日志文件。 |
| CKPT | LGWR更新检查点信息,CKPT将检查点位置写入控制文件和数据文件头。 |
| LREG | LGWR在日志切换时通知LREG(Listener Registration)更新服务状态(12c+)。 |
八、核心知识点总结表
| 类别 | 核心要点 |
|---|---|
| 核心功能 | 将Redo Log Buffer写入Online Redo Log Files |
| 关键触发条件 | 事务提交、缓冲区1/3满、DBWn写脏块前、日志切换、每3秒超时 |
| 性能指标 | log file sync(用户提交等待)、log file parallel write(LGWR写入延迟) |
| 调优参数 | LOG_BUFFER(缓冲区大小)、日志文件大小(减少切换)、存储I/O优化 |
| 高可用设计 | 日志多路复用、多日志组、RAC故障转移 |
| 故障恢复 | 日志文件损坏需重建或恢复,归档满需清理 |
九、运维命令速查
-- 查看LGWR状态
SELECT * FROM V$BGPROCESS WHERE NAME='LGWR';
-- 监控日志切换频率
SELECT TO_CHAR(FIRST_TIME,'YYYY-MM-DD HH24') HOUR, COUNT(*) SWITCHES
FROM V$LOG_HISTORY GROUP BY TO_CHAR(FIRST_TIME,'YYYY-MM-DD HH24');
-- 强制日志切换
ALTER SYSTEM SWITCH LOGFILE;
-- 检查Redo Buffer分配等待
SELECT NAME, VALUE FROM V$SYSSTAT
WHERE NAME='redo buffer allocation retries'; -- 理想值=0
注:在Oracle RAC中,每个实例有独立的LGWR进程,但共享同一组日志文件(通过全局锁协调写入)。
通过深入理解LGWR的机制,DBA可有效优化事务性能、预防日志相关故障,并设计高可靠的数据库架构。记住:LGWR的稳定性直接决定了数据库的崩溃恢复能力与事务一致性保障。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




