Oracle Redo 深度解析

Oracle Redo 深度解析

适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Redo 是数据库恢复的基础[1]:

作用

  • 实例恢复
  • 介质恢复
  • Data Guard
  • Streams

详细见:Oracle Undo 与 Redo 调优


2. Redo 结构

2.1 Redo Record

- 变更数据
- SCN
- 时间戳
- 事务 ID

2.2 Redo Log Buffer

- SGA
- 循环
- LGWR 写盘

2.3 Redo Log File

- 多组多成员
- 循环使用
- 归档保留

3. Redo 生成

3.1 触发

- DML(INSERT/UPDATE/DELETE)
- DDL
- 事务提交

3.2 减少

-- 1. NOLOGGING
ALTER TABLE t NOLOGGING;
INSERT /*+ APPEND */ INTO t SELECT ...;

-- 2. 直接路径
SQL*Loader DIRECT=TRUE

-- 3. 批量
FORALL

详细见:Oracle 数据加载工具对比


4. Redo Log Buffer

4.1 流程

1. DML → Redo Buffer
2. Redo Buffer 满
3. LGWR 写盘
4. 提交确认

4.2 触发 LGWR

- 提交
- 1/3 满
- 1MB
- 3 秒
- DBWn 写前

4.3 调优

ALTER SYSTEM SET log_buffer = 64M;

5. Redo Log File

5.1 多组

ALTER DATABASE ADD LOGFILE GROUP 4 
  ('/u01/oradata/redo04a.log', '/u02/oradata/redo04b.log') SIZE 2G;

5.2 多成员

ALTER DATABASE ADD LOGFILE MEMBER 
  '/u03/oradata/redo01c.log' TO GROUP 1;

5.3 切换

ALTER SYSTEM SWITCH LOGFILE;
ALTER SYSTEM ARCHIVE LOG CURRENT;

详细见:Oracle Redo 日志配置与管理


6. 归档

6.1 归档模式

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

6.2 归档目的地

ALTER SYSTEM SET log_archive_dest_1 = 'location=/u01/archive';
ALTER SYSTEM SET log_archive_dest_2 = 'service=standby async';

详细见:Oracle 数据库归档模式配置


7. SCN

7.1 类型

  • System SCN
  • Commit SCN
  • Block SCN
  • Redo SCN

7.2 流程

1. 事务开始
2. 分配 SCN
3. Redo 记录
4. 提交 SCN
5. 数据块更新 SCN

8. 实例恢复

8.1 流程

1. SMON 前滚(Redo)
2. 已提交 + 未提交
3. 打开数据库
4. SMON 回滚未提交(Undo)

8.2 MTTR

- Redo 应用时间
- Undo 应用时间
- 检查点优化

详细见:Oracle 检查点深度解析


9. 介质恢复

9.1 RMAN

RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN;

9.2 不完全

RMAN> RUN {
  SET UNTIL TIME "...";
  RESTORE DATABASE;
  RECOVER DATABASE;
}
SQL> ALTER DATABASE OPEN RESETLOGS;

详细见:Oracle RMAN 备份恢复


10. Data Guard

10.1 Redo 传输

- 主库 → 备库
- SYNC / ASYNC
- ARCH / LGWR

10.2 应用

- 备库 MRP
- Redo 应用
- 实时

详细见:Oracle Data Guard 部署


11. Standby Redo Log

11.1 创建

ALTER DATABASE ADD STANDBY LOGFILE GROUP 11 
  ('/u01/oradata/stdby_redo11.log') SIZE 200M;

11.2 优势

- 实时应用
- 零数据丢失
- Active Data Guard

12. 性能

12.1 log file sync

- 提交等待
- LGWR 慢
- Redo Log SSD
- 减少提交频率

12.2 log file parallel write

- LGWR I/O
- 磁盘性能
- 多磁盘

12.3 log buffer space

- Buffer 满
- 增大 log_buffer
- LGWR 优化

13. 监控

13.1 v$log

SELECT group#, thread#, sequence#, members, bytes/1024/1024 AS mb, status, archived
FROM v$log;

13.2 v$logfile

SELECT group#, member, status FROM v$logfile;

13.3 切换频率

SELECT 
  TO_CHAR(first_time, 'YYYY-MM-DD HH24') AS hour,
  COUNT(*) AS switches
FROM v$log_history
WHERE first_time > SYSDATE - 1
GROUP BY TO_CHAR(first_time, 'YYYY-MM-DD HH24');

13.4 等待

SELECT event, total_waits, time_waited
FROM v$system_event
WHERE event IN ('log file sync', 'log file parallel write', 'log buffer space');

14. 常见坑与排错

14.1 log file sync 高

- SSD Redo Log
- 减少提交
- 异步提交

14.2 切换频繁

- 增大 Redo Log
- 减少长事务

14.3 ORA-00312/013

- Redo Log 损坏
- 多成员冗余
- CLEAR 重建

15. 最佳实践

  1. 多组多成员:可用性
  2. 大小合适:15-20 分钟切换
  3. SSD:性能
  4. 归档:保留
  5. Standby Redo:Data Guard
  6. 监控切换:调整
  7. log file sync:调优
  8. NOLOGGING 批量:减少
  9. 测试恢复:可行
  10. 文档化:配置

16. 参考资料

[1] Oracle Database Concepts 19c, “Redo Log” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/redo-log-files.html