74-Oracle Redo Log与Archive Log对比

小伙伴们,我们平日里是不是和Oracle日志天天打交道。Redo Log是数据库的"实时操作流水账",由LGWR进程持续写入循环使用的日志组。它在实例故障时提供"重做"能力,确保已提交的数据变更不丢失,是崩溃恢复的核心。数据写到磁盘后,对应的Redo空间才可复用。Archive Log则是Redo Log的"历史存档"。当Redo Log写满切换时,ARCH进程将其内容完整拷贝到独立的归档存储(磁盘或磁带)。它是数据库时间点恢复、建立物理备库(Data Guard)的基石,能恢复到历史上任意归档时刻的状态。

平日里,我们既要注意Redo组日志切换频率,更要确保归档目录空间,一旦归档失败则整个库会挂起。两者协同工作,共同保障数据的持久性与可恢复性。

一、核心功能与技术原理

1. Redo Log(联机重做日志)​
  • 功能
    • 实时事务记录​:捕获所有数据变更(DML/DDL),包括未提交和已提交事务,用于崩溃恢复(Crash Recovery)。
    • 数据持久化保证​:通过Log-Force-at-Commit机制确保事务提交时,相关Redo记录必先写入磁盘。
  • 技术原理
    • 循环写入机制​:
      • 至少需2组日志文件(默认3组),每组可含多个镜像成员(防单点故障)。
      • LGWR进程按触发条件写入Redo Log File:提交事务、3秒超时、Buffer 1/3满或含1MB数据、日志切换(Log Switch)。
    • 日志状态流转​:
      • - CURRENT:当前写入中;ACTIVE:需用于恢复(检查点未完成);INACTIVE:可覆盖。
    • 恢复作用​:实例崩溃时,通过Redo Log前滚(Roll Forward)重演变更,回滚(Roll Back)未提交事务。
2. Archive Log(归档日志)​
  • 功能
    • 长期事务备份​:归档模式下,ARCn进程将写满的Redo Log复制为持久化文件,支持介质恢复(Media Recovery)和时间点恢复(PITR)。
    • 数据连续性保障​:避免Redo Log循环覆盖导致历史事务丢失。
  • 技术原理
    • 归档触发条件​:日志切换(Log Switch)时,若数据库为归档模式,ARCn复制ACTIVE状态的Redo Log到指定路径。
    • 写入依赖​:
      • 若归档未完成,LGWR无法覆盖该日志组,可能引发LOG SWITCH WAITING等待。
    • 命名规则​:由log_archive_format定义(如%t_%s_%r.arc),含线程号、序列号、数据库周期。

二、核心区别与联系

​1. 关键差异对比​

​维度​

​Redo Log​

​Archive Log​

​生命周期​

循环覆盖

永久保留(需手动清理)

​写入主体​

LGWR实时写入

ARCn异步复制

​必需性​

所有数据库必需

仅归档模式启用

​恢复场景​

实例崩溃恢复

介质恢复 + 时间点恢复

​空间占用​

固定大小

持续增长(需监控清理)

2. 协作关系
  • 数据恢复链​:
    • Archive Log是Redo Log的离线副本,两者共同实现任意时间点恢复。
  • 写入依赖​:
    • 归档未完成时,Redo Log状态保持ACTIVE,禁止覆盖;归档成功后转为INACTIVE。

三、验证脚本与操作指南

​1. 状态检查与模式配置​
-- 检查归档模式  
SELECT log_mode FROM v$database;  
LOG_MODE
_____________
ARCHIVELOG
-- 查看Redo Log组状态(GROUP#, STATUS, ARCHIVED)  
SELECT group#, bytes, status, archived FROM v$log;  
   GROUP#        BYTES STATUS      ARCHIVED
_________ ____________ ___________ ___________
        1    209715200 CURRENT     NO
        2    209715200 INACTIVE    YES
        3    209715200 INACTIVE    YES
-- 查看归档日志信息  
SELECT name, sequence#, completion_time FROM v$archived_log;
SELECT name, sequence#, completion_time FROM v$archived_log;

NAME                                                                         SEQUENCE# COMPLETION_TIME
_________________________________________________________________________ ____________ __________________
/opt/oracle/DB_FRA/FREE/archivelog/2025_06_17/o1_mf_1_32_n511l1dt_.arc              32 17-JUN-25
/opt/oracle/DB_FRA/FREE/archivelog/2025_06_17/o1_mf_1_33_n51pgbns_.arc              33 17-JUN-25
/opt/oracle/DB_FRA/FREE/archivelog/2025_06_17/o1_mf_1_34_n52r3qgk_.arc              34 17-JUN-25
 2. 手动触发日志切换与归档​
-- 强制切换Redo Log组  
ALTER SYSTEM SWITCH LOGFILE;
System altered.
-- 手动归档当前Redo Log  
ALTER SYSTEM ARCHIVE LOG CURRENT;
System altered.
-- 验证归档进度(ARCHIVED列应为YES)
SELECT group#, archived FROM v$log;
  GROUP# ARCHIVED
_________ ___________
        1 YES
        2 YES
        3 NO
3. 模拟介质恢复指定SCN​

补充下:CDB/PDB的SCN关系​:

全局SCN一致​:所有PDB共享CDB的SCN序列,确保事务全局有序。​检查点SCN独立​:各PDB维护自身数据文件的检查点SCN,用于恢复隔离​​

​CDB与PDB共享全局SCN序列​在容器数据库(CDB)中,​所有PDB共享同一个SCN序列。

当在PDB内执行事务时,SCN的递增与CDB全局SCN同步,确保整个容器数据库的事务顺序一致性。

例如,若CDB当前SCN为1000,PDB中的事务提交后,CDB的SCN会递增至1001,且该PDB的后续操作也基于此新值。

​PDB拥有独立的检查点SCN​

每个PDB的数据文件头记录自身的检查点SCN​(checkpoint_change#),用于控制文件恢复时的起点。可通过以下查询验证:

-- 在PDB中查询:
ALTER SESSION SET CONTAINER = FREEPDB1;
SELECT name, checkpoint_change# FROM v$datafile;
NAME                                                                                                       CHECKPOINT_CHANGE#
_______________________________________________________________________________________________________ _____________________
/opt/oracle/oradata/FREE/FREEPDB1/system01.dbf                                                                        6396247
/opt/oracle/oradata/FREE/FREEPDB1/sysaux01.dbf                                                                        6396247
/opt/oracle/oradata/FREE/FREEPDB1/undotbs01.dbf                                                                       6396247
/opt/oracle/oradata/FREE/FREEPDB1/users01.dbf                                                                         6396247
/opt/oracle/product/23ai/dbhomeFree/dbs/hr_data01.dbf                                                                 6396247
/opt/oracle/product/23ai/dbhomeFree/dbs/OE_data01.dbf                                                                 6396247
/opt/oracle/product/23ai/dbhomeFree/dbs/SH_data01.dbf                                                                 6396247
/opt/oracle/product/23ai/dbhomeFree/dbs/CO_data01.dbf                                                                 6396247
/opt/oracle/oradata/FREE/FREE/375897C9631A1373E0636100020A8B39/datafile/o1_mf_shrink_t_n4wq0rmz_.dbf                  6396247
/opt/oracle/product/23ai/dbhomeFree/dbs/SECURE_LOB_TS.dbf                                                             6396247
/opt/oracle/product/23ai/dbhomeFree/dbs/assm_ts.dbf                                                                   6396247

11 rows selected.
--查询SCN​
SELECT current_scn FROM v$database;
--此SCN仅反映该PDB的数据文件一致性点,与全局SCN不同。

-- 恢复至指定SCN(需提前备份数据文件)
RECOVER DATABASE UNTIL SCN 6397196;

-- 恢复至时间点  
RECOVER DATABASE UNTIL TIME '2025-06-24 14:00:00';
4. 归档空间与异常监控
-- 检查归档目的地状态  
SELECT dest_name, status FROM v$archive_dest;  
DEST_NAME              STATUS
______________________ ___________
LOG_ARCHIVE_DEST_1     VALID
LOG_ARCHIVE_DEST_2     INACTIVE

-- 监控归档延迟(若ARCHIVED列滞后于CURRENT序列号需告警)  
SELECT 
    (SELECT MAX(sequence#) FROM v$log WHERE status = 'CURRENT') AS current_seq,
    (SELECT MAX(sequence#) FROM v$archived_log) AS archived_seq,
    (SELECT MAX(sequence#) FROM v$log WHERE status = 'CURRENT') 
    - (SELECT MAX(sequence#) FROM v$archived_log) AS gap
FROM dual;
--
CURRENT_SEQ    ARCHIVED_SEQ    GAP
____________ _______________ ______
          6              82   -76

四、运维实践建议

Redo Log配置
  • 大小​:500MB~2GB/组,控制20~30分钟切换一次。
  • 组数​:至少3组,高并发场景增加至4~6组避免等待。
  • 成员冗余​:每组至少2个成员,分散至不同物理磁盘。
Archive Log管理
  • 保留策略​:按需设置保留时长或恢复窗口:
-- 设置基于恢复窗口的保留策略(确保归档保留至少7天)
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 50G;  -- 先调整闪回区大小
-- 检查当前保留策略
RMAN> SHOW RETENTION POLICY;
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
  • 定期清理​: 
-- 使用RMAN安全清理(避免误删未备份的日志)
RMAN> CROSSCHECK ARCHIVELOG ALL;                     -- 校验日志有效性
RMAN> DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-7';  -- 清理7天前的日志
故障处理
  • 归档阻塞​:若因空间不足导致ARCn停滞,扩容或清理归档目录后执行ALTER SYSTEM ARCHIVE LOG START。
  • 日志损坏​:使用CLEAR LOGFILE重建损坏的Redo Log组:
-- 查看所有归档目标状态,显示前10个归档目标
SELECT DEST_NAME, STATUS, ERROR FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID <= 10;
-- 检查最近归档日志序列
SELECT THREAD#, SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY FIRST_TIME DESC;
-- 暂停归档(必须CDB)
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1 = DEFER;
-- 清理或扩容存储(例如删除旧归档日志)
RMAN> DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-7'; 
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1 = ENABLE; -- 恢复归档

五、使用体验

  • 功能互补性​:Redo Log是实时事务的内存-磁盘流水线,保障短时故障恢复;Archive Log是其长期归档,扩展恢复能力至介质故障与历史时间点。
  • 协作价值​:两者构成Oracle高可靠恢复体系的核心,归档模式是生产数据库的必备配置,确保RPO≈0。
  • 性能平衡​:Redo Log大小需避免频繁切换(性能损耗)与过大(恢复延迟);Archive Log需保障存储空间与I/O带宽
### Redo LogArchive Log 的大小配置优化 #### 关于 Redo Log 配置和优化 在 Oracle 数据库中,Redo 日志用于记录数据库中的所有更改操作。这些日志对于恢复数据至关重要。为了确保性能和可靠性,合理设置 Redo 日志的大小非常重要。 - **OracleRedo Log 文件的数量和大小** 建议每个 Redo 日志组至少有三个成员,以提高可用性和冗余度[^4]。单个 Redo 日志文件的大小应基于工作负载来决定。通常情况下,建议将 Redo 日志文件大小设置为几百兆字节到几吉字节之间,具体取决于事务频率和持续时间。如果切换过于频繁,则可能需要增加 Redo 日志文件的大小;反之亦然。 - **MySQL InnoDB 存储引擎下的 Redo Log (也称为重做日志)** 对于 MySQL 使用 InnoDB 存储引擎的情况,其 redo log 大小由参数 `innodb_log_file_size` 控制。较大的 redo log 可减少 checkpoint 操作次数从而提升写入密集型应用的性能,但也会延长崩溃恢复的时间。推荐初始值可以根据服务器硬件资源情况设定为几十 MB 到数 GB 不等,并通过监控实际 I/O 性能调整至最佳状态[^5]。 ```sql -- 修改 innodb_log_file_size 参数示例 SET GLOBAL innodb_log_file_size = 1G; ``` 注意,在修改此参数前需停止 mysqld 进程并删除旧的日志文件再重启服务生效。 #### 关于 Archive Log 配置和优化 Archived Logs 是 Oracle 自动备份机制的一部分,当联机重做日志被填满时会将其复制成归档形式保存下来供后续介质恢复使用。 - **控制归档目的地** 设置合理的归档路径可以防止磁盘空间耗尽问题发生。可以通过初始化参数 ARCHIVE_DEST 或 LOG_ARCHIVE_DEST_n 来指定多个不同的目标位置分散存储压力[^6]。 - **压缩技术的应用** 启用二进制日志压缩功能能够有效降低存储备份所需的空间开销。例如,在 MySQL 中可通过如下方式开启 binlog-compress: ```ini binlog-compression=ON ``` 尽管上述选项适用于某些版本的 Percona Server 扩展特性而非原生 MySQL 功能,但它展示了如何利用现代技术手段解决传统难题的一个方向[^7]。 --- ### 结论 无论是针对 Oracle Database 还是 MySQL 数据库环境而言,科学规划 redo logs 和 archive logs 的尺寸均有助于增强整体系统的稳定运行表现以及灾难应对能力。然而需要注意的是任何改动都应当经过充分测试验证之后才应用于生产环境中去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值