Oracle 归档日志(Archive Log)与归档模式详解
Oracle 归档日志(Archive Log)与归档模式详解
适用版本:Oracle Database 19c / 23ai 阅读基础:了解 Redo Log 机制、LGWR 进程 文档版本:v1.0 / 2026-07
目录
- 1. 概述:归档日志的作用与价值
- 2. 归档模式 vs 非归档模式
- 3. 归档模式切换
- 4. ARCn 进程与归档机制
- 5. 归档目标配置
- 6. 归档日志命名格式
- 7. 归档日志相关视图
- 8. 归档日志管理
- 9. 快速恢复区(Fast Recovery Area)
- 10. 常见坑与排错
- 11. 最佳实践
- 12. 参考资料
1. 概述:归档日志的作用与价值
归档日志(Archived Redo Log)是联机重做日志(Online Redo Log)的持久化副本[1]。
核心作用:
- 介质恢复:数据文件损坏后,结合备份和归档日志恢复到任意时间点
- 时间点恢复(PITR):恢复到指定时间点
- Data Guard:备用库同步数据源
- LogMiner:挖掘历史变更
- 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 自动启动复制刚写满的日志组
核心职责:
- 复制联机日志到归档目标
- 多个目标并行归档
- 远程归档(Data Guard 场景)
- 通知 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;
解决:
- 找出 Redo 生成过多的 SQL
- 批量操作用 NOLOGGING
- 优化应用,减少不必要的事务
坑 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. 最佳实践
- 生产必须用 ARCHIVELOG 模式:所有核心数据库
- 配置多个归档目标:本地 + 远程(容灾)
- 使用 FRA:统一管理恢复文件
- FRA 保留 20% 余量:避免 ORA-00257
- 配置 RMAN 保留策略:自动清理过期归档
- 监控 FRA 使用率:告警阈值 80%
- 不要直接 rm 归档日志:用 RMAN 删除
- 定期备份归档日志:防止单点丢失
- 归档日志放独立磁盘:避免与数据文件争用
- Data Guard 场景配置 FAL:自动解决间隙
- 核心场景启用强制归档:
ALTER DATABASE FORCE LOGGING - 批量操作用 NOLOGGING:减少归档生成
- 监控归档生成速率:发现异常及时处理
- 配置归档日志压缩:节省空间
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/
相关文章