Oracle 归档日志(Archive Log)操作手册

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

十一、最佳实践

  1. 生产库必须开启归档模式,配合 RMAN 定期备份
  2. 归档路径与数据文件路径分开,独立磁盘或文件系统
  3. 配置双归档目标(本地 + 远端/FRA),防止单点故障
  4. 定期清理已备份的归档日志,保留最近 2-3 天用于应急恢复
  5. 监控归档目录使用率,超过 80% 触发告警
  6. 删除归档日志始终通过 RMAN,不要直接 rm
相关推荐
远方16092 小时前
117-Oracle 26ai FILTER(过滤)子句新特性
大数据·数据库·sql·oracle·database
isNotNullX2 小时前
一文讲清8大数据清洗方法
大数据·数据库·数据挖掘·数据迁移
Francek Chen2 小时前
【大数据存储与管理】分布式数据库HBase:05 HBase运行机制
大数据·数据库·hadoop·分布式·hdfs·hbase
小小怪7502 小时前
将Python Web应用部署到服务器(Docker + Nginx)
jvm·数据库·python
麦聪聊数据2 小时前
SQL 到 API 转化过程中的版本控制与灰度发布机制
数据库·sql·低代码·微服务
Coder-coco2 小时前
家政服务管理系统|基于springboot + vue家政服务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·家政服务管理系统
人道领域2 小时前
Day | 07 【苍穹外卖 :用户端添加购物车】
java·开发语言·数据库·后端·苍穹外卖
lzp07912 小时前
Neo4j图数据库学习(二)——SpringBoot整合Neo4j
数据库·学习·neo4j
XDHCOM2 小时前
MySQL报错LDAP认证初始化连接池失败,远程修复思路和故障排查分享
数据库·mysql·adb