Oracle 归档日志(Archive Log)与归档模式详解

适用版本:Oracle Database 19c / 23ai
阅读基础:了解 Redo Log 机制、LGWR 进程
文档版本:v1.0 / 2026-07


目录


1. 概述:归档日志的作用与价值

归档日志(Archived Redo Log)是联机重做日志(Online Redo Log)的持久化副本[1]。

核心作用:

  1. 介质恢复:数据文件损坏后,结合备份和归档日志恢复到任意时间点
  2. 时间点恢复(PITR):恢复到指定时间点
  3. Data Guard:备用库同步数据源
  4. LogMiner:挖掘历史变更
  5. GoldenGate / Streams:数据同步源头

与联机重做日志的关系:

联机 Redo Log(循环使用)
  ↓ 日志切换 + ARCn 进程
归档 Redo Log(永久保存,直到被备份策略清理)

核心特点:

  • 持久化:归档后不会自动删除(除非配置 RMAN 保留策略)
  • 顺序文件:每个归档日志对应一个日志序列号
  • 只读:归档后不可修改
  • 必备:所有生产数据库必须开启归档模式

2. 归档模式 vs 非归档模式

2.1 两种模式对比

维度 NOARCHIVELOG ARCHIVELOG
联机日志切换后 直接覆盖 先归档再覆盖
历史日志 不保留 保留为归档日志
介质恢复 仅能恢复到最后一次备份 可恢复到任意时间点
在线备份 不支持(热备) 支持
时间点恢复(PITR) 不支持 支持
Data Guard 不支持 支持
闪回数据库 不支持 支持
性能开销 低 略高(归档 I/O)
磁盘空间 低 高(持续增长)
生产推荐 ❌ 不推荐 ✅ 必选

2.2 如何选择

必须用 ARCHIVELOG 模式的场景:

  • 所有生产数据库
  • 需要介质恢复
  • 需要时间点恢复
  • 需要在线备份(不停机备份)
  • Data Guard 备用库
  • 闪回数据库

可以用 NOARCHIVELOG 模式的场景:

  • 开发/测试环境(可重建数据)
  • 数据仓库(数据可重新加载)
  • 只读数据库

3. 归档模式切换

3.1 查看当前模式

-- 方法 1:查询 v$database
SELECT log_mode FROM v$database;
-- ARCHIVELOG 或 NOARCHIVELOG

-- 方法 2:ARCHIVE LOG LIST 命令
SQL> ARCHIVE LOG LIST;

输出示例:

Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     1234
Next log sequence to archive   1236
Current log sequence           1236

3.2 切换到 ARCHIVELOG 模式

步骤:

-- 1. 关闭数据库
SHUTDOWN IMMEDIATE;

-- 2. 启动到 mount
STARTUP MOUNT;

-- 3. 切换到归档模式
ALTER DATABASE ARCHIVELOG;

-- 4. 打开数据库
ALTER DATABASE OPEN;

-- 5. 验证
ARCHIVE LOG LIST;
SELECT log_mode FROM v$database;

-- 6. 立即做全库备份(重要!)
-- 因为模式切换后的备份才能用于恢复

坑 1:切换归档模式必须重启数据库,且只能在 MOUNT 状态切换。

3.3 切换回 NOARCHIVELOG 模式

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

-- 验证
SELECT log_mode FROM v$database;

坑 2:从 ARCHIVELOG 切换到 NOARCHIVELOG 后,之前的归档日志将无法使用,应立即做全备。


4. ARCn 进程与归档机制

4.1 ARCn 进程作用

ARCn(Archiver)是 Oracle 后台进程,负责将联机重做日志复制到归档目标[1]。

触发时机:

  • 日志切换发生时
  • ARCn 自动启动复制刚写满的日志组

核心职责:

  1. 复制联机日志到归档目标
  2. 多个目标并行归档
  3. 远程归档(Data Guard 场景)
  4. 通知 LGWR 归档完成(让该日志组可被覆盖)

4.2 归档流程

日志切换发生
  ↓
ARCn 进程启动
  ↓
读取 ACTIVE 状态的联机日志组
  ↓
复制到所有归档目标(LOG_ARCHIVE_DEST_n)
  ↓
归档完成,日志组状态变为 INACTIVE
  ↓
LGWR 可以覆盖该日志组

坑 3:如果归档速度跟不上日志切换速度,LGWR 会等待,业务卡顿(log file switch (archiving needed) 等待)。

4.3 配置多个 ARCn 进程

-- 查看当前 ARCn 进程数
SHOW PARAMETER log_archive_max_processes

-- 增加进程数(最多 30)
ALTER SYSTEM SET log_archive_max_processes = 4 SCOPE=BOTH;

何时增加:

  • 归档速度跟不上日志生成
  • 多个归档目标并行归档
  • Data Guard 多个备用库

5. 归档目标配置

5.1 单一归档目标

方式 1:使用 LOG_ARCHIVE_DEST 参数

ALTER SYSTEM SET log_archive_dest = '/u01/arch' SCOPE=SPFILE;

-- 关闭 FRA(如启用)
ALTER SYSTEM SET db_recovery_file_dest = '' SCOPE=SPFILE;

-- 重启生效
SHUTDOWN IMMEDIATE;
STARTUP;

坑 4:LOG_ARCHIVE_DEST 和 DB_RECOVERY_FILE_DEST 互斥,不能同时使用。

方式 2:使用 FRA(推荐)

ALTER SYSTEM SET db_recovery_file_dest = '/u01/fra' SCOPE=SPFILE;
ALTER SYSTEM SET db_recovery_file_dest_size = 50G SCOPE=SPFILE;

-- 重启生效
SHUTDOWN IMMEDIATE;
STARTUP;

-- 验证
SHOW PARAMETER db_recovery_file_dest

5.2 多个归档目标

配置多个目标(最多 31 个):

-- 主目标
ALTER SYSTEM SET log_archive_dest_1 = 'LOCATION=/u01/arch' SCOPE=SPFILE;

-- 次目标(容灾)
ALTER SYSTEM SET log_archive_dest_2 = 'LOCATION=/u02/arch' SCOPE=SPFILE;

-- 远程目标(Data Guard)
ALTER SYSTEM SET log_archive_dest_3 = 'SERVICE=standby_db' SCOPE=SPFILE;

-- 启用各目标
ALTER SYSTEM SET log_archive_dest_state_1 = 'ENABLE' SCOPE=SPFILE;
ALTER SYSTEM SET log_archive_dest_state_2 = 'ENABLE' SCOPE=SPFILE;
ALTER SYSTEM SET log_archive_dest_state_3 = 'ENABLE' SCOPE=SPFILE;

目标属性:

属性 说明
LOCATION=dir 本地目录
SERVICE=tnsname 远程数据库服务
MANDATORY 必须成功(默认 dest_1)
OPTIONAL 可选(失败不影响主库)
REOPEN=300 失败后 300 秒重试
MAX_FAILURE=3 最多重试 3 次
SYNC 同步归档(Data Guard Maximum Protection)
ASYNC 异步归档(默认)
AFFIRM 等待磁盘确认
NOAFFIRM 不等待(默认)
VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE) 角色相关

示例:

-- 本地强制归档 + 远程可选归档
ALTER SYSTEM SET log_archive_dest_1 = 'LOCATION=/u01/arch MANDATORY' SCOPE=SPFILE;
ALTER SYSTEM SET log_archive_dest_2 = 'SERVICE=standby_db OPTIONAL REOPEN=300' SCOPE=SPFILE;

5.3 归档目标状态

-- 查看归档目标状态
SELECT dest_id, dest_name, status, destination, error
FROM v$archive_dest
WHERE status != 'INACTIVE';

-- 状态说明:
-- VALID      正常
-- DEFERRED   手工禁用
-- ERROR      错误
-- DISABLED   已禁用
-- BAD PARAM  参数错误

临时禁用目标:

ALTER SYSTEM SET log_archive_dest_state_2 = 'DEFER' SCOPE=BOTH;

重新启用:

ALTER SYSTEM SET log_archive_dest_state_2 = 'ENABLE' SCOPE=BOTH;

5.4 远程归档目标(Data Guard)

-- 主库配置
ALTER SYSTEM SET log_archive_dest_2 = 
  'SERVICE=standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) 
   DB_UNIQUE_NAME=standby' SCOPE=SPFILE;

ALTER SYSTEM SET log_archive_dest_state_2 = 'ENABLE' SCOPE=SPFILE;

-- 配置 FAL Server(解决归档间隙)
ALTER SYSTEM SET fal_server = 'standby' SCOPE=SPFILE;
ALTER SYSTEM SET fal_client = 'primary' SCOPE=SPFILE;

6. 归档日志命名格式

通过 LOG_ARCHIVE_FORMAT 参数控制归档日志文件名[1]。

可用变量:

变量 含义
%s 日志序列号
%S 日志序列号,0 填充到 9 位
%t 线程号
%T 线程号,0 填充
%r resetlogs ID
%R resetlogs ID,0 填充
%d 数据库 ID
%D 数据库 ID,0 填充

配置示例:

ALTER SYSTEM SET log_archive_format = '%t_%s_%r.arc' SCOPE=SPFILE;
-- 文件名示例:1_1234_952063145.arc

-- 推荐
ALTER SYSTEM SET log_archive_format = 'arch_%t_%s_%r.arc' SCOPE=SPFILE;
-- arch_1_1234_952063145.arc

坑 5:LOG_ARCHIVE_FORMAT 是静态参数,需重启生效。

坑 6:使用 FRA 时,归档日志路径自动为 FRA/<db_unique_name>/archivelog/YYYY-MM-DD/,文件名仍由 LOG_ARCHIVE_FORMAT 决定。


7. 归档日志相关视图

7.1 v$database

SELECT name, log_mode, log_switch_interval, 
       checkpoint_change#, archive_log_change#
FROM v$database;

7.2 v$archived_log

SELECT recid, name, thread#, sequence#, 
       first_change#, next_change#, 
       first_time, completion_time, 
       blocks, block_size, 
       archived, status, 
       deleted, backup_count
FROM v$archived_log
WHERE completion_time > SYSDATE - 1
ORDER BY sequence# DESC;

7.3 v$archive_dest

SELECT dest_id, dest_name, status, destination, 
       binding, target, archiver, 
       error, schedule
FROM v$archive_dest
WHERE status != 'INACTIVE'
ORDER BY dest_id;

7.4 v$archive_processes

SELECT process, status, log_sequence, state
FROM v$archive_processes
WHERE status = 'ACTIVE';

7.5 v$archive_gap

-- Data Guard 场景:查看归档间隙
SELECT * FROM v$archive_gap;

8. 归档日志管理

8.1 手工归档

-- 归档当前日志组
ALTER SYSTEM ARCHIVE LOG CURRENT;

-- 归档所有未归档日志
ALTER SYSTEM ARCHIVE LOG ALL;

-- 归档指定日志序列
ALTER SYSTEM ARCHIVE LOG SEQ 1234;

8.2 查看归档进度

-- 当前会话归档操作
SELECT sid, serial#, operation, sofar, totalwork
FROM v$session_longops
WHERE opname LIKE 'RMAN%' OR opname LIKE 'ARCHIVE%';

-- ARCn 进程状态
SELECT process, status, log_sequence, state
FROM v$archive_processes;

8.3 删除归档日志

坑 7:绝对不要直接用 OS 命令 rm 删除归档日志!会导致控制文件中元数据不一致。

正确方式 1:RMAN 删除

rman target /

-- 查看状态
RMAN> CROSSCHECK ARCHIVELOG ALL;

-- 删除过期
RMAN> DELETE EXPIRED ARCHIVELOG ALL;

-- 删除 7 天前的
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';

-- 删除到指定序列号
RMAN> DELETE ARCHIVELOG UNTIL SEQUENCE 1234;

-- 删除并备份
RMAN> BACKUP ARCHIVELOG ALL DELETE INPUT;

正确方式 2:配置保留策略自动删除

RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
RMAN> CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 2 TIMES TO DISK;

8.4 归档日志空间管理

-- 查看 FRA 使用情况
SELECT name, 
       space_limit / 1024 / 1024 / 1024 AS limit_gb,
       space_used / 1024 / 1024 / 1024 AS used_gb,
       space_reclaimable / 1024 / 1024 / 1024 AS reclaimable_gb,
       number_of_files
FROM v$recovery_file_dest;

-- 按类型查看 FRA 占用
SELECT file_type, 
       percent_space_used, 
       percent_space_reclaimable,
       number_of_files
FROM v$flash_recovery_area_usage;

坑 8:FRA 满会导致数据库挂起!必须监控并定期清理。


9. 快速恢复区(Fast Recovery Area)

FRA 是 Oracle 10g 引入的统一管理备份和恢复文件的机制[1]。

FRA 包含的文件:

  • 归档日志
  • RMAN 备份集
  • 控制文件自动备份
  • 闪回日志
  • 多路复用的控制文件
  • 多路复用的联机日志

配置 FRA:

ALTER SYSTEM SET db_recovery_file_dest = '/u01/fra' SCOPE=SPFILE;
ALTER SYSTEM SET db_recovery_file_dest_size = 100G SCOPE=SPFILE;

-- 重启生效
SHUTDOWN IMMEDIATE;
STARTUP;

FRA 自动管理:

  • 当 FRA 空间不足时,Oracle 会按保留策略自动删除过期文件
  • 闪回日志优先保留,归档日志优先删除

坑 9:FRA 空间不能 100% 用满,建议保留 20% 余量。否则:

  • 归档失败,数据库挂起
  • 闪回数据库失效
  • 备份失败

FRA 大小估算:

FRA 大小 = 
  数据文件总大小 × 2(一份全备 + 增量)
+ 每天归档日志量 × 保留天数
+ 闪回日志(如启用闪回数据库)
+ 控制文件备份

10. 常见坑与排错

坑 1:ORA-00257 archiver error

现象:业务报错,alert log 显示归档目标空间不足。

解决:

# 1. 检查 FRA 空间
sqlplus / as sysdba
SELECT * FROM v$recovery_file_dest;

# 2. 检查磁盘空间
df -h /u01/fra

# 3. 清理归档日志
rman target /
RMAN> CROSSCHECK ARCHIVELOG ALL;
RMAN> DELETE EXPIRED ARCHIVELOG ALL;
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';

# 4. 或增大 FRA
ALTER SYSTEM SET db_recovery_file_dest_size = 200G SCOPE=BOTH;

坑 2:归档目标不可访问

现象:v$archive_dest 显示 ERROR 状态。

解决:

-- 查看错误
SELECT dest_id, status, error FROM v$archive_dest WHERE status = 'ERROR';

-- 修复目标路径或权限
chown oracle:oinstall /u02/arch
chmod 750 /u02/arch

-- 或临时禁用
ALTER SYSTEM SET log_archive_dest_state_2 = 'DEFER' SCOPE=BOTH;

坑 3:归档日志间隙(Data Guard)

现象:备用库落后主库,v$archive_gap 有数据。

解决:

-- 在备用库查询
SELECT * FROM v$archive_gap;

-- 在主库找缺失的归档日志
SELECT name 
FROM v$archived_log 
WHERE thread# = 1 
  AND sequence# BETWEEN <low> AND <high>;

-- 手工传到备用库并注册
-- scp arch_xxx.arc standby:/u01/arch/
-- 在备用库:
ALTER DATABASE REGISTER LOGFILE '/u01/arch/arch_xxx.arc';

坑 4:rm 直接删除归档日志

现象:磁盘空间没释放,控制文件元数据不一致。

解决:

rman target /

# 1. 交叉检查
RMAN> CROSSCHECK ARCHIVELOG ALL;

# 2. 标记为 EXPIRED
# (CROSSCHECK 已自动标记)

# 3. 删除 EXPIRED 记录
RMAN> DELETE EXPIRED ARCHIVELOG ALL;

坑 5:归档日志生成过多

现象:磁盘被归档日志填满。

诊断:

-- 按小时统计 Redo 生成量
SELECT 
    TO_CHAR(first_time, 'YYYY-MM-DD HH24') AS hour,
    COUNT(*) AS log_count,
    SUM(blocks * block_size) / 1024 / 1024 / 1024 AS redo_gb
FROM v$archived_log
WHERE first_time > SYSDATE - 7
GROUP BY TO_CHAR(first_time, 'YYYY-MM-DD HH24')
ORDER BY hour;

解决:

  1. 找出 Redo 生成过多的 SQL
  2. 批量操作用 NOLOGGING
  3. 优化应用,减少不必要的事务

坑 6:归档速度跟不上日志切换

现象:log file switch (archiving needed) 等待。

解决:

-- 1. 增加 ARCn 进程
ALTER SYSTEM SET log_archive_max_processes = 8 SCOPE=BOTH;

-- 2. 增加联机日志组数和大小
ALTER DATABASE ADD LOGFILE GROUP 4 '/u01/oradata/orcl/redo04.log' SIZE 2G;

-- 3. 归档日志放高性能磁盘

坑 7:闪回数据库失效

现象:FRA 空间不足,闪回日志被覆盖。

解决:

-- 1. 增大 FRA
ALTER SYSTEM SET db_recovery_file_dest_size = 200G SCOPE=BOTH;

-- 2. 调整闪回保留时间
ALTER SYSTEM SET db_flashback_retention_target = 1440 SCOPE=BOTH;
-- 1440 分钟 = 1 天

-- 3. 重新启用闪回
ALTER DATABASE FLASHBACK OFF;
ALTER DATABASE FLASHBACK ON;

11. 最佳实践

  1. 生产必须用 ARCHIVELOG 模式:所有核心数据库
  2. 配置多个归档目标:本地 + 远程(容灾)
  3. 使用 FRA:统一管理恢复文件
  4. FRA 保留 20% 余量:避免 ORA-00257
  5. 配置 RMAN 保留策略:自动清理过期归档
  6. 监控 FRA 使用率:告警阈值 80%
  7. 不要直接 rm 归档日志:用 RMAN 删除
  8. 定期备份归档日志:防止单点丢失
  9. 归档日志放独立磁盘:避免与数据文件争用
  10. Data Guard 场景配置 FAL:自动解决间隙
  11. 核心场景启用强制归档:ALTER DATABASE FORCE LOGGING
  12. 批量操作用 NOLOGGING:减少归档生成
  13. 监控归档生成速率:发现异常及时处理
  14. 配置归档日志压缩:节省空间

12. 参考资料

[1] 墨天轮,暮雨,《Oracle 体系结构-日志文件汇总》:
https://www.modb.pro/db/1970883931515924480

[2] Oracle Database 19c Administrator’s Guide,Managing Archived Redo Logs:
https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-archived-redo-logs.html

[3] Oracle Database 19c Backup and Recovery User’s Guide:
https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/

[4] Oracle MOS Note 1580790.1,Troubleshooting ORA-01555:
https://support.oracle.com/knowledge/Oracle%20Cloud/1580790_1.html

[5] CSDN,凤舞飘伶,《Oracle 日志》:
https://blog.csdn.net/woshaguayi/article/details/102697676

[6] Oracle Database 19c Data Guard Concepts and Administration:
https://docs.oracle.com/en/database/oracle/oracle-database/19/dgbkr/


相关文章
- Oracle 重做日志(Redo Log)机制详解
- Oracle 控制文件深度解析
- Oracle 后台进程详解
- Oracle 快速恢复区(FRA)详解
- Oracle Data Guard 概念与架构
- Oracle RMAN 备份恢复全流程
- Oracle 闪回数据库详解