什么是 REDO LOG,它在 Oracle 数据库中的作用是什么?

REDO LOG(重做日志) 是 Oracle 数据库中一种关键的事务日志机制 ,用于记录数据库中所有数据变更操作 (如 INSERT、UPDATE、DELETE、DDL 等)所产生的"重做记录"(Redo Records)。它的核心作用是保障数据库的持久性(Durability)和崩溃恢复能力


一、REDO LOG 的基本组成

在 Oracle 中,REDO LOG 由以下部分构成:

  1. 重做日志文件(Redo Log Files)

    • 物理存储在磁盘上的文件(通常以 .log 结尾);
    • 分为联机重做日志 (Online Redo Log) 和 归档重做日志(Archived Redo Log);
    • 联机日志是数据库运行时实时写入的日志;
    • 归档日志是联机日志被填满后,由 ARCH 进程归档保存的副本(仅在归档模式下启用)。
  2. 重做日志组(Redo Log Groups)

    • Oracle 至少需要 2 个重做日志组(推荐 3 个以上);
    • 每个组包含一个或多个成员(Member),实现冗余(多路复用);
    • 日志写入按组循环进行:LGWR(Log Writer)进程依次写入 Group 1 → Group 2 → Group 3 → 回到 Group 1......
  3. LGWR 进程(Log Writer)

    • 负责将 SGA 中的 Redo Buffer 内容写入磁盘上的联机重做日志文件;
    • 触发写入的条件包括:事务提交(COMMIT)、每 3 秒、Redo Buffer 满 1/3、DBWn 写脏块前等。

二、REDO LOG 的核心作用

1. 保证事务的持久性(ACID 中的 D)
  • 当用户执行 COMMIT 时,Oracle 并不立即把数据块写入数据文件;
  • 而是先确保对应的 REDO 记录已写入磁盘日志文件
  • 即使随后发生断电或崩溃,只要 REDO LOG 存在,就能在重启时恢复该事务。

关键原则"日志先行"(Write-Ahead Logging, WAL)------任何数据块的修改必须先有对应的 REDO 记录落盘。

2. 支持实例恢复(Instance Recovery)
  • 数据库异常关闭(如宕机)后重启时,SMON 进程会自动执行:
    • 前滚(Roll Forward):应用 REDO LOG 中未写入数据文件的已提交事务;
    • 回滚(Roll Back):撤销未提交的事务(利用 UNDO + REDO 中的信息);
  • 最终使数据库回到一致状态。
3. 支撑数据库备份与时间点恢复(PITR)
  • ARCHIVELOG 模式 下,REDO LOG 被归档保存;
  • 结合全量备份 + 归档日志,可将数据库恢复到任意历史时间点(如误删表后恢复到删除前)。
4. 支持 Data Guard、GoldenGate 等高可用/复制技术
  • 物理备库(Data Guard)通过应用主库传来的 REDO LOG 实现同步;
  • REDO 是 Oracle 实现实时数据复制的基础。

三、REDO LOG 与其他组件的关系

组件 与 REDO LOG 的关系
UNDO UNDO 用于回滚和一致性读,但 UNDO 本身的修改也需要记录 REDO!
数据文件 数据文件更新可能滞后,REDO 确保变更不会丢失
CHECKPOINT 触发 DBWn 将脏块写入数据文件,并推进 REDO 的"检查点位置",减少恢复时间

四、简单示例说明

sql 复制代码
UPDATE employees SET salary = 10000 WHERE id = 101;
COMMIT;

执行过程:

  1. 修改内存中的数据块(Buffer Cache);
  2. 在 Redo Buffer 中生成重做记录(如:"将 block X 的 offset Y 处从 A 改为 B");
  3. 执行 COMMIT → LGWR 立即将 Redo Buffer 中的相关记录写入磁盘 REDO LOG;
  4. 此时事务即视为"永久生效",即使数据库立刻崩溃,重启后也能通过 REDO 恢复此更新。

总结

REDO LOG 是 Oracle 数据库的"黑匣子",它:

  • 记录所有数据变更;
  • 确保已提交事务永不丢失;
  • 是崩溃恢复、备份恢复、数据复制的基石;
  • 必须合理配置大小、数量和归档策略,避免性能瓶颈(如"日志切换等待")。

没有 REDO LOG,Oracle 就无法保证 ACID,也无法实现企业级高可用。

相关推荐
海南java第二人8 小时前
Nebula Graph 实战:基于图数据库存储 CMDB 实体关系
数据库·图数据库·nebula
曹牧8 小时前
oracle:“not all variables bound”
数据库·oracle
数据库百宝箱8 小时前
Oracle RMAN Image Copy 本地恢复
数据库·oracle
zuYM4g7Dp9 小时前
NoSql数据库设计心得
数据库·nosql
睡不醒男孩03082311 小时前
第七篇:揭秘 PostgreSQL 数据库内核级管控:CLup 深度架构设计与高可用底座技术白皮书
数据库·postgresql·clup
cmes_love12 小时前
Level 2逐笔成交历史数据下载方法笔记
数据库·笔记·oracle
swordbob12 小时前
MySQL字符集陷阱:从Oracle迁移踩坑到utf8mb4强制规范
数据库·sql
牛油果子哥q12 小时前
【C++ STL string 】C++ STL string 终极精讲:底层原理、内存机制、全套API、深浅拷贝、易错坑点与工程实战规范
数据库·c++
十五年专注C++开发12 小时前
MySql中各种功能用sql语句实现总结
数据库·sql·mysql
数据库小学妹13 小时前
AI时代数据库怎么选?多模融合、数据统一存储与选型实战指南
数据库·人工智能·经验分享·ai