当前位置: 首页 > news >正文

【Oracle数据库指南】第30篇:Oracle重做日志规划与配置详解

上一篇【第29篇】Oracle控制文件的备份、恢复与重建
下一篇【第31篇】Oracle重做日志文件管理操作详解


摘要

重做日志(Redo Log)是Oracle数据库持久性和恢复能力的基础。每次对数据库的修改都会先记录到重做日志,再写入数据文件,这是Oracle崩溃恢复和介质恢复的核心机制。本文详细讲解重做日志的工作原理、日志组与成员的规划、日志文件大小的选择、日志切换的触发机制、以及多路复用配置的最佳实践。


一、重做日志工作原理

1.1 为什么需要重做日志

Oracle遵循**先写日志(Write-Ahead Logging,WAL)**原则:

用户执行 DML 操作(INSERT/UPDATE/DELETE) ↓ 将变更记录写入重做日志缓冲区(Redo Log Buffer,SGA中) ↓ LGWR 进程将重做日志缓冲区刷写到在线重做日志文件 ↓ DBWR 进程将脏数据块写回数据文件 ↓ 实例崩溃时:从最近检查点起,应用重做日志 → 恢复所有已提交事务

1.2 重做日志文件类型

类型说明
在线重做日志(Online Redo Log)当前活跃,数据库运行时实时写入
归档重做日志(Archived Redo Log)在线日志组切换后,被ARCH进程复制到归档目录

二、在线重做日志的结构

2.1 日志组与成员

在线重做日志 ├── 日志组 1 (GROUP 1) ← 当前 CURRENT 或 ACTIVE │ ├── 成员 /u01/redo1/redo01a.log (物理文件,两个成员互为镜像) │ └── 成员 /u02/redo2/redo01b.log ├── 日志组 2 (GROUP 2) ← INACTIVE(已归档或不再需要) │ ├── 成员 /u01/redo1/redo02a.log │ └── 成员 /u02/redo2/redo02b.log └── 日志组 3 (GROUP 3) ← INACTIVE ├── 成员 /u01/redo1/redo03a.log └── 成员 /u02/redo2/redo03b.log
  • 日志组(Log Group):逻辑单元,LGWR 写入时同时写到组内所有成员
  • 成员(Member):物理文件,同一组的成员内容完全相同(镜像)
  • 循环写入:写满一组后切换到下一组(循环利用)

2.2 日志文件状态

-- 查看日志组状态SELECTgroup#, thread#, sequence#, bytes/1024/1024 AS mb,members,statusFROMv$logORDERBYgroup#;
状态含义
CURRENT当前正在写入的日志组,LGWR 正在使用
ACTIVE已写满但还未归档(或不需要归档),实例恢复需要它
INACTIVE已归档(或不需要归档),可被覆盖
UNUSED新创建、从未使用过的日志组

三、日志规划建议

3.1 日志组数量规划

最少3组,通常建议 4~6 组:

  • 少于3组:日志切换频繁,可能出现"等待日志"(Log Wait)
  • 建议4组以上:确保 ARCH 进程有足够时间归档,不阻塞 LGWR

日志等待的危害

日志组1(CURRENT) → 写满 → 切换到日志组2 日志组2 状态还是 ACTIVE(未归档) → 数据库挂起等待 ARCH 完成归档 → 业务中断

3.2 每组成员数量

  • 最少2个成员,分布在不同物理磁盘
  • 一个成员损坏不会中断数据库(LGWR 报错但继续用完好成员)
  • 超过5个成员意义不大

3.3 日志文件大小规划

过小的风险

  • 日志切换频繁 → 频繁触发检查点 → 性能下降
  • 频繁归档 → 归档目录增长快

过大的风险

  • 实例崩溃恢复时,需要应用较多重做日志 → 恢复时间长

规划方法:监控日志切换频率,目标是每20~30分钟切换一次:

-- 查看历史日志切换频率SELECTTO_CHAR(FIRST_TIME,'YYYY-MM-DD HH24')ASlog_hour,COUNT(*)ASswitch_countFROMv$log_historyGROUPBYTO_CHAR(FIRST_TIME,'YYYY-MM-DD HH24')ORDERBYlog_hourDESC;-- 目标:switch_count ≈ 2~3 次/小时(即每20~30分钟切换一次)

推荐大小

  • 小型数据库:100MB ~ 200MB
  • 中型数据库:200MB ~ 500MB
  • 大型OLTP:500MB ~ 1GB
  • 数据仓库:1GB ~ 4GB

四、查看当前重做日志配置

-- 查看日志组信息SELECTgroup#, thread#, sequence#, bytes/1024/1024 AS size_mb,members,archived,statusFROMv$logORDERBYgroup#;-- 查看日志文件成员SELECTgroup#, member, status, is_recovery_dest_fileFROMv$logfileORDERBYgroup#, member;-- 查看日志历史(归档记录)SELECTsequence#, first_time, next_time, archived, appliedFROMv$log_historyORDERBYsequence# DESCFETCHFIRST20ROWSONLY;

五、创建和管理日志组

5.1 添加日志组

-- 添加一个新的日志组(2个成员,不同磁盘)ALTERDATABASEADDLOGFILEGROUP4('/u01/redo1/redo04a.log','/u02/redo2/redo04b.log')SIZE300M;-- 添加不指定组号(Oracle自动分配组号)ALTERDATABASEADDLOGFILE('/u01/redo1/redo05a.log','/u02/redo2/redo05b.log')SIZE300M;

5.2 删除日志组

-- 先确认要删除的日志组状态(只能删除 INACTIVE 状态的组)SELECTgroup#, status FROM v$log;-- 删除日志组(物理文件不会自动删除,需手工清理)ALTERDATABASEDROPLOGFILEGROUP4;-- 在操作系统中删除物理文件-- rm /u01/redo1/redo04a.log-- rm /u02/redo2/redo04b.log

⚠️注意

  • 不能删除 CURRENT 和 ACTIVE 状态的日志组
  • 不能删除归档模式下未归档的日志组
  • 数据库至少需要保留2个日志组

5.3 手动触发日志切换

-- 强制切换当前日志组(测试时使用)ALTERSYSTEM SWITCH LOGFILE;-- 强制归档(确保所有日志都已归档)ALTERSYSTEM ARCHIVE LOGALL;-- 触发检查点并等待完成ALTERSYSTEMCHECKPOINT;

六、日志成员管理

6.1 为现有组添加成员

-- 为日志组1添加第3个成员ALTERDATABASEADDLOGFILE MEMBER'/u03/redo3/redo01c.log'TOGROUP1;-- 为所有日志组添加新成员(通过循环脚本)DECLARECURSORc_groupsISSELECTgroup# FROM v$log;BEGINFORgrpINc_groupsLOOPEXECUTEIMMEDIATE'ALTER DATABASE ADD LOGFILE MEMBER '||'''/u03/redo3/redo0'||grp.group# || 'c.log'' TO GROUP ' || grp.group#;ENDLOOP;END;/

6.2 删除日志成员

-- 删除某个组的一个成员(该组至少保留一个成员)ALTERDATABASEDROPLOGFILE MEMBER'/u03/redo3/redo01c.log';-- 在操作系统中删除物理文件-- rm /u03/redo3/redo01c.log

七、重做日志缓冲区配置

-- 查看当前 LOG_BUFFER 大小SHOWPARAMETER log_buffer;-- 查看重做日志写等待统计SELECTname,valueFROMv$sysstatWHEREnameIN('redo log space requests','redo log space wait time');-- 若 redo log space requests > 0 且持续增长,考虑增大 LOG_BUFFER

LOG_BUFFER 调优建议

  • 默认:max(512K, 128K * CPU_COUNT)
  • 通常无需调整,默认值足够
  • 若频繁出现log buffer space等待事件,适当增大(一般不超过100MB)

八、最佳实践总结

8.1 规划原则

推荐配置示例(生产OLTP数据库): 日志组数量:4组 每组成员:2个(不同磁盘/控制器) 日志大小:300MB ~ 500MB 日志切换目标:每20~30分钟一次 目录布局: 成员A:/u01/redo1/(本地高速SSD) 成员B:/u02/redo2/(不同SSD或远程镜像)

8.2 日志相关检查清单

-- 每日检查日志状态SELECTgroup#, status, archived FROM v$log;-- 检查日志切换频率(过去24小时)SELECTTO_CHAR(FIRST_TIME,'YYYY-MM-DD HH24')AShour,COUNT(*)ASswitchesFROMv$log_historyWHEREFIRST_TIME>SYSDATE-1GROUPBYTO_CHAR(FIRST_TIME,'YYYY-MM-DD HH24')ORDERBY1DESC;-- 检查日志等待事件SELECTevent,total_waits,total_timeouts,time_waitedFROMv$system_eventWHEREeventLIKE'log%';

九、总结

Oracle重做日志规划的核心要点:

  1. WAL原则:先写日志,再写数据,是恢复的基础
  2. 日志组结构:最少3组,每组多成员,成员分布不同磁盘
  3. 日志大小:目标每2030分钟切换一次,通常200MB500MB
  4. 多路复用:同组不同成员互为镜像,一个损坏不影响运行
  5. 状态监控:关注 ACTIVE 状态的日志组是否及时归档
  6. 切换测试:定期执行 ALTER SYSTEM SWITCH LOGFILE 验证切换正常

上一篇【第29篇】Oracle控制文件的备份、恢复与重建
下一篇【第31篇】Oracle重做日志文件管理操作详解


参考资料

  • 《Oracle 11g数据库管理员指南》— 刘宪军著
  • Oracle官方文档:Database Administrator’s Guide - Managing the Redo Log
  • Oracle官方文档:Database Concepts - Redo Log
http://www.jsqmd.com/news/809718/

相关文章:

  • 界面原型设计工具--墨刀
  • 2026宜宾装修公司怎么选?本地人实测这几家,别墅大宅、全案整装都有谱 - 深度智识库
  • 广西江马新能源科技:南宁共享扫码代步车哪家好 - LYL仔仔
  • AI视频生产力革命(2024企业级集成实录):ChatGPT+Sora 2协同架构设计与低代码部署方案
  • 在Claude Code中配置Taotoken作为备用API解决封号与Token不足问题
  • 襄阳CMA甲醛检测治理公司及洁净室公共卫生检测报告排行榜(2026版) - 张诗林资源库
  • 三亚CMA甲醛检测治理及公共卫生检测报告排行榜(2026版) - 张诗林资源库
  • 从爱因斯坦求和到代码实践:解锁numpy.einsum()的高维张量运算
  • ClawSuite:模块化网络安全工具集的设计原理与实战应用
  • 软件开发创新第11周作业
  • 廊坊CMA甲醛检测治理及公共卫生检测报告地址联系方式集合(2026版) - 张诗林资源库
  • 沧州CMA甲醛检测治理公司及洁净室公共卫生检测报告排行榜(2026版) - 张诗林资源库
  • 3分钟掌握Sketch批量文本替换:Find And Replace插件完全指南
  • 2026横店中式目的地婚礼(1) - charlieruizvin
  • ChatGPT对话本地化导出工具:一键备份与集成到Kelivo/Cherry Studio
  • 资本意志下的工程师生存指南:从高通裁员看技术与商业的博弈
  • 烟台CMA甲醛检测治理及公共卫生检测报告排行榜(2026版) - 张诗林资源库
  • 天津市CMA甲醛检测治理及公共卫生检测报告排行榜(2026版) - 张诗林资源库
  • 选型不踩坑:近红外光谱分析仪的技术演进与采购要点 - 品牌推荐大师
  • 3个步骤让Windows电脑也能安装安卓应用:APK Installer全攻略
  • Shell 脚本中如何安全存储数据库密码避免明文?
  • 海口CMA甲醛检测治理及公共卫生检测报告地址联系方式集合(2026版) - 张诗林资源库
  • 基于 4SAPI 的企业文档智能处理系统:效率提升 20 倍,信息提取准确率 95%
  • 告别手动整理:用油猴脚本一键提取百度网盘群文件目录树
  • 第八部分-企业级实践——37. 容器编排选型
  • 长沙CMA甲醛检测治理及公共卫生检测报告地址联系方式集合(2026版) - 张诗林资源库
  • 3步魔法!用DupeGuru彻底清理电脑重复文件,释放50%存储空间
  • 别光看逻辑!用1200PLC做电梯控制,这些硬件仿真细节才是关键
  • 2026汕头婚纱摄影排名|消费者综合满意度与体验度 - charlieruizvin
  • 半导体产业模式抉择:从IDT与AOS晶圆厂交易看Fabless与Fab-lite战略