Oracle Redo 深度解析
Oracle Redo 深度解析
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Redo 是数据库恢复的基础[1]:
作用:
- 实例恢复
- 介质恢复
- Data Guard
- Streams
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. 最佳实践
- 多组多成员:可用性
- 大小合适:15-20 分钟切换
- SSD:性能
- 归档:保留
- Standby Redo:Data Guard
- 监控切换:调整
- log file sync:调优
- NOLOGGING 批量:减少
- 测试恢复:可行
- 文档化:配置
16. 参考资料
[1] Oracle Database Concepts 19c, “Redo Log” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/redo-log-files.html