小伙伴们,我们平日里是不是和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
四、运维实践建议
- 大小:500MB~2GB/组,控制20~30分钟切换一次。
- 组数:至少3组,高并发场景增加至4~6组避免等待。
- 成员冗余:每组至少2个成员,分散至不同物理磁盘。
- 保留策略:按需设置保留时长或恢复窗口:
-- 设置基于恢复窗口的保留策略(确保归档保留至少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带宽
956

被折叠的 条评论
为什么被折叠?



