暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

Oracle体系结构-LGWR详解

原创 暮雨 2025-09-23
469

一、LGWR的核心定位与使命

  1. 定义
    LGWR(Log Writer)是Oracle数据库的核心后台进程,负责将重做日志缓冲区(Redo Log Buffer)中的内容写入在线重做日志文件(Online Redo Log Files)

  2. 核心使命

    • 保障事务持久性(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. 写入流程详解

  1. 锁定日志缓冲区
    LGWR锁定待写入的缓冲区区域(避免用户进程同时修改)。
  2. 批量写入日志文件
    连续顺序将多个Redo记录一次性写入日志文件(减少I/O次数)。
  3. 更新控制信息
    • 在日志文件头记录检查点位置(Checkpoint Position)
    • 更新控制文件中的日志序列号(Log Sequence Number)
  4. 释放缓冲区空间
    标记缓冲区区域可复用,通知等待事务提交完成。

三、核心特性

  1. 顺序写入(Sequential Write)

    • 按事务发生顺序写入日志文件,最大化磁盘I/O效率(对比DBWn的随机写)。
  2. 异步I/O(Asynchronous I/O)

    • 使用DISK_ASYNCH_IO参数启用异步I/O,提升并发性能(需OS支持)。
  3. 组提交(Group Commit)

    • 合并多个事务提交请求,一次性写入日志文件,减少I/O次数。
  4. 并行写入(Parallel Write)

    • 多日志组配置下,可并行写入不同日志文件(需LOG_PARALLELISM>1)。
  5. 实时同步(Real-Time Apply)

    • Data Guard中启用REALTIME_APPLY时,LGWR直接发送Redo到备库(12c+)。

四、关键作用

  1. 事务持久化保证

    COMMIT; -- 触发LGWR写日志,事务永久生效
    
  2. 崩溃恢复基石

    • 异常关闭后重启时,SMON进程使用Redo日志前滚恢复(Roll Forward)。
  3. 支持在线备份

    ALTER DATABASE BEGIN BACKUP; -- 备份期间Redo日志记录所有块变更
    
  4. 日志挖掘基础

    • LogMiner依赖Redo日志解析历史变更。
  5. 高可用架构核心

    • 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 - 设置ASYNCAFFIRM平衡性能与安全
LOG_FILE_SIZE 通常100MB-1G 根据每小时日志生成量调整(避免频繁切换)
_LOG_PARALLELISM 1(隐含参数) 多CPU系统可设为2-4(需测试)

3. 优化场景

  • 高并发提交延迟(log file sync等待高)
    解决方案

    1. 启用异步提交COMMIT WRITE BATCH NOWAIT)。
    2. 将日志文件放在低延迟存储(如NVMe SSD)。
    3. 使用批量提交减少提交次数。
  • LGWR写入慢(log file parallel write等待高)
    解决方案

    1. 分离日志文件到独立磁盘(避免I/O竞争)。
    2. 启用异步I/ODISK_ASYNCH_IO=TRUE)。
    3. 增加日志文件大小减少切换频率

六、故障处理与高可用设计

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. 高可用设计

  1. 多路复用日志文件(Multiplexing)
    ALTER DATABASE ADD LOGFILE MEMBER 
      '/disk2/redo01b.log' TO GROUP 1; -- 同一组日志多副本
    
  2. 日志文件组轮换(Log Switching)
    • 至少配置3组日志文件,避免恢复中断。
  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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论