什么是 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,也无法实现企业级高可用。

相关推荐
敲上瘾19 分钟前
Qt Widgets入门:项目模板解析与Hello World
开发语言·数据库·c++·qt·ui·qt6.3
bksczm1 小时前
Redis 持久化:RDB 快照与 AOF 日志
数据库·redis·mybatis
.痞老板.2 小时前
mysql初阶--数据库设计
数据库·mysql·oracle
Decay__3 小时前
SQL Server 数据库全栈运维实战系列 — 合集索引(24 篇)
运维·数据库·sql·mysql·架构
Thanks_ks3 小时前
SQL 的 GROUP BY 与聚合函数:从会写 SELECT 到会做统计
数据库·sql·mysql·group by·数据统计·聚合函数·having
Decay__11 小时前
12_MySQL InnoDB 内存与锁调优 —— Buffer Pool、redo log、隔离级别与锁等待
运维·数据库·sql·mysql·架构
笃行35012 小时前
AI数据库的库内四层结构,KingbaseES 产品拆解
数据库
我是大猴子14 小时前
redis
数据库·redis·缓存
苏宸啊16 小时前
MySQL(一)
数据库·mysql
2603_9696948516 小时前
JDBC 基础学习笔记:API 核心原理解析与 CRUD 代码实操
数据库·笔记·mysql·学习方法·database·sql注入