Oracle 归档日志(Archive Log)操作手册
一、基本概念
Oracle 归档日志(Archive Log)是联机重做日志(Online Redo Log)的历史副本。开启归档模式(ARCHIVELOG)后,每当一个 redo log 组被切换时,Oracle 会自动将其内容复制到归档目标路径,用于数据库恢复、Data Guard、备份等场景。
二、查看当前归档状态
sql
-- 查看数据库归档模式
SELECT LOG_MODE FROM V$DATABASE;
-- 结果: ARCHIVELOG 或 NOARCHIVELOG
-- 查看归档进程状态
SELECT DEST_ID, STATUS, TARGET, ARCHIVER, SCHEDULE, DESTINATION
FROM V$ARCHIVE_DEST
WHERE STATUS != 'INACTIVE';
-- 查看归档日志列表
SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME, ARCHIVED, STATUS, NAME
FROM V$ARCHIVED_LOG
ORDER BY SEQUENCE# DESC;
-- 查看归档日志生成速率(按小时)
SELECT TRUNC(FIRST_TIME, 'HH') AS HOUR,
COUNT(*) AS LOG_COUNT,
ROUND(SUM(BLOCKS * BLOCK_SIZE) / 1024 / 1024, 2) AS SIZE_MB
FROM V$ARCHIVED_LOG
WHERE FIRST_TIME > SYSDATE - 1
GROUP BY TRUNC(FIRST_TIME, 'HH')
ORDER BY 1;
三、开启归档模式
需要 SYSDBA 权限,数据库需重启到 MOUNT 状态。
bash
# 1. 以 sysdba 登录
sqlplus / as sysdba
sql
-- 2. 关闭数据库
SHUTDOWN IMMEDIATE;
-- 3. 启动到 MOUNT 状态
STARTUP MOUNT;
-- 4. 开启归档模式
ALTER DATABASE ARCHIVELOG;
-- 5. 打开数据库
ALTER DATABASE OPEN;
-- 6. 验证
SELECT LOG_MODE FROM V$DATABASE;
-- 应返回: ARCHIVELOG
-- 7. 手动触发一次归档(验证归档进程正常)
ALTER SYSTEM ARCHIVE LOG CURRENT;
四、关闭归档模式
生产环境慎用,关闭后无法进行基于时间点的恢复。
sql
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE NOARCHIVELOG;
ALTER DATABASE OPEN;
-- 验证
SELECT LOG_MODE FROM V$DATABASE;
-- 应返回: NOARCHIVELOG
五、归档路径配置
5.1 查看当前归档路径
sql
-- 查看所有归档目标
SHOW PARAMETER LOG_ARCHIVE_DEST;
SHOW PARAMETER LOG_ARCHIVE_DEST_1;
-- 或查询参数视图
SELECT NAME, VALUE FROM V$PARAMETER
WHERE NAME LIKE 'log_archive_dest%'
ORDER BY NAME;
-- 查看归档格式
SHOW PARAMETER LOG_ARCHIVE_FORMAT;
5.2 设置归档路径
sql
-- 设置主归档路径(立即生效,重启后失效)
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1 = 'LOCATION=/data/oracle/archive' SCOPE=BOTH;
-- 设置归档文件命名格式
-- %t=线程号, %s=序列号, %r=resetlogs ID
ALTER SYSTEM SET LOG_ARCHIVE_FORMAT = 'arch_%t_%s_%r.arc' SCOPE=SPFILE;
-- 设置多个归档目标(双归档)
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1 = 'LOCATION=/data/oracle/archive1' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2 = 'LOCATION=/data/oracle/archive2' SCOPE=BOTH;
-- 设置归档目标为 FRA(快速恢复区)
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST = '/data/oracle/fra' SCOPE=BOTH;
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 50G SCOPE=BOTH;
5.3 使用 FRA(快速恢复区)
sql
-- 查看 FRA 使用情况
SELECT * FROM V$RECOVERY_FILE_DEST;
-- 查看 FRA 中各类文件占用
SELECT FILE_TYPE, PERCENT_SPACE_USED, PERCENT_SPACE_RECLAIMABLE, NUMBER_OF_FILES
FROM V$RECOVERY_AREA_USAGE;
六、手动归档操作
sql
-- 归档当前 redo log
ALTER SYSTEM ARCHIVE LOG CURRENT;
-- 归档所有未归档的 redo log
ALTER SYSTEM ARCHIVE LOG ALL;
-- 归档指定序列号(线程1,序列100)
ALTER SYSTEM ARCHIVE LOG SEQUENCE 100 THREAD 1;
-- 手动切换 redo log(触发归档)
ALTER SYSTEM SWITCH LOGFILE;
七、删除归档日志
推荐使用 RMAN 删除,避免只删文件不更新控制文件导致 RMAN 报错。
7.1 使用 RMAN 删除(推荐)
bash
rman target /
rman
-- 删除所有已备份的归档日志
DELETE ARCHIVELOG ALL BACKED UP 1 TIMES TO DISK;
-- 删除 7 天前的归档日志
DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
-- 删除指定时间之前的归档(不检查是否已备份)
DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-3';
-- 删除指定序列范围
DELETE ARCHIVELOG SEQUENCE BETWEEN 100 AND 200 THREAD 1;
-- 删除已过期的归档(控制文件中记录但文件不存在)
CROSSCHECK ARCHIVELOG ALL;
DELETE EXPIRED ARCHIVELOG ALL;
7.2 查看归档占用空间后再删除
rman
-- 先查看归档日志列表和大小
LIST ARCHIVELOG ALL;
-- 查看可以删除的归档(已备份)
LIST ARCHIVELOG ALL BACKED UP 1 TIMES TO DISK;
7.3 操作系统层面删除(不推荐,仅紧急情况)
bash
# 删除 7 天前的归档文件
find /data/oracle/archive -name "*.arc" -mtime +7 -exec rm -f \;
rman
-- 删除文件后,必须在 RMAN 中执行 crosscheck 同步控制文件
CROSSCHECK ARCHIVELOG ALL;
DELETE EXPIRED ARCHIVELOG ALL;
八、归档日志空间告警处理
8.1 归档目录满导致数据库挂起
sql
-- 查看归档目标状态
SELECT DEST_ID, STATUS, ERROR FROM V$ARCHIVE_DEST_STATUS;
-- 查看归档进程是否有错误
SELECT * FROM V$ARCHIVE_PROCESSES;
sql
-- 清理空间后,重置归档目标状态
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1 = DEFER;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1 = ENABLE;
8.2 FRA 空间不足
sql
-- 扩大 FRA 大小
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 100G SCOPE=BOTH;
九、归档日志监控 SQL
sql
-- 每天归档日志数量和大小统计
SELECT TRUNC(FIRST_TIME) AS LOG_DATE,
COUNT(*) AS LOG_COUNT,
ROUND(SUM(BLOCKS * BLOCK_SIZE) / 1024 / 1024 / 1024, 2) AS SIZE_GB
FROM V$ARCHIVED_LOG
WHERE STANDBY_DEST = 'NO'
GROUP BY TRUNC(FIRST_TIME)
ORDER BY 1 DESC;
-- 未归档的 redo log
SELECT GROUP#, SEQUENCE#, STATUS, ARCHIVED
FROM V$LOG
WHERE ARCHIVED = 'NO';
十、常见问题
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 数据库挂起,无法写入 | 归档目录空间满 | 清理归档文件,扩容目录 |
| RMAN 报 ORA-19511 | 归档文件已被手动删除 | CROSSCHECK + DELETE EXPIRED |
| 归档进程 ARC0 停止 | 归档目标不可达 | 检查路径权限和磁盘空间 |
| 切换到 ARCHIVELOG 失败 | 未设置归档路径 | 先配置 LOG_ARCHIVE_DEST_1 |
| FRA 空间告警 | 归档积压未清理 | RMAN 删除已备份归档,或扩大 FRA |
十一、最佳实践
- 生产库必须开启归档模式,配合 RMAN 定期备份
- 归档路径与数据文件路径分开,独立磁盘或文件系统
- 配置双归档目标(本地 + 远端/FRA),防止单点故障
- 定期清理已备份的归档日志,保留最近 2-3 天用于应急恢复
- 监控归档目录使用率,超过 80% 触发告警
- 删除归档日志始终通过 RMAN,不要直接
rm