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带宽
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值