归档日志:目录规划与日常清理

29 篇讲过 ORA-00257 的应急处理,这篇往前走一步:归档目录一开始怎么规划、日常怎么清,才不至于每次都火烧眉毛。手工 rm 归档引发的血案,也一并说说怎么收场。


一、归档日志是恢复的原料

数据库开归档模式(ARCHIVELOG)后,LGWR 写完的重做日志在切换时被 ARCn 进程复制一份落地,就是归档日志。它的唯一用途:介质恢复。数据文件坏了,拿备份 + 归档日志,能把数据回放到故障前一刻。丢一段归档,备份和故障之间的时间窗就没了,只能回到旧备份的时间点。

所以清理归档的铁律只有一条:确认已经备份进 RMAN 以后,才能删。


二、目录怎么规划

1. 和数据文件分盘

数据文件所在盘坏了,归档在另一块盘上,备份链还在;归档和数据文件挤一块盘,盘一坏两边一起丢,恢复的原料和被恢复对象同归于尽。归档目录至少和数据文件不同物理盘,有条件再上一份异地。

2. 按日期子目录

用 FRA(快速恢复区)时,Oracle 自动按天分目录:

/u01/app/oracle/fast_recovery_area/ORCL/archivelog/2025_09_28/o1_mf_1_12345_.arc

按天分目录的好处:一眼看出每天的量,du -sh 2025_09_* 就能看趋势;清理时也能按天整目录核对。自定义目录(log_archive_dest_1 指向普通路径)时 Oracle 是平铺写的,不会自动分日期,要么用 FRA,要么接受平铺。

3. 归档量估算

-- 每天的 redo 量(字节),归档量和它基本一致
SELECT TO_CHAR(FIRST_TIME, 'YYYY-MM-DD') AS 日期,
       ROUND(SUM(BLOCKS * BLOCK_SIZE)/1024/1024) AS MB
FROM v$archived_log
GROUP BY TO_CHAR(FIRST_TIME, 'YYYY-MM-DD')
ORDER BY 1 DESC
FETCH FIRST 7 ROWS ONLY;

每天的量 × 打算保留的天数 × 1.5 的余量,就是归档盘的容量。


三、查归档的三种姿势

-- 1. 总览:当前序号、归档目的地
ARCHIVE LOG LIST
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     3120
Next log sequence to archive   3123
Current log sequence           3123
-- 2. 明细:最近的归档都在哪、多大、删没删
SELECT NAME, SEQUENCE#, COMPLETION_TIME,
       ROUND(BLOCKS * BLOCK_SIZE / 1024 / 1024) AS MB,
       DELETED
FROM v$archived_log
WHERE DEST_ID = 1
ORDER BY SEQUENCE# DESC
FETCH FIRST 10 ROWS ONLY;

-- 3. FRA 的整体占用
SELECT name, ROUND(space_limit/1024/1024) AS 上限MB,
       ROUND(space_used/1024/1024) AS 已用MB,
       ROUND(space_reclaimable/1024/1024) AS 可回收MB,
       ROUND(100 * space_used / space_limit, 1) AS 使用率
FROM v$recovery_file_dest;

操作系统层面再交叉验证一下:

du -sh /u01/app/oracle/fast_recovery_area/ORCL/archivelog/*

四、RMAN 删除的正确姿势

先说清理逻辑:让 RMAN 管归档目录。 哪些能删,RMAN 按 retention policy 算。

1. 配置保留策略

RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
-- 或者按份数
RMAN> CONFIGURE RETENTION POLICY TO REDUNDANCY 2;

RECOVERY WINDOW OF 7 DAYS 表示:保留足够多的备份和归档,能恢复到最近 7 天内任意时刻。归档是否"obsolete"由这个策略算出来。

2. 日常两条删除命令

-- 按时间删:7 天前的归档
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';

-- 按策略删:备份不再需要的(obsolete)
RMAN> DELETE NOPROMPT OBSOLETE;

NOPROMPT 是免确认,脚本里用;手工操作去掉它,RMAN 会先列出清单等确认。

3. 更稳的套路:备份完顺手删

RMAN> BACKUP ARCHIVELOG ALL NOT BACKED UP 2 TIMES DELETE INPUT;

归档备份满两份后,自动删掉磁盘上的源文件。备份和清理一条命令完成,不存在"忘了备份就删"的窗口。


五、手工 rm 的灾难与抢救

存储满了,有人直接 rm 掉几个归档文件——磁盘是空出来了,但控制文件里仍记着这些归档存在。后果:

  • RMAN 备份归档时去读文件,报 RMAN-06056 / ORA-19583,备份失败
  • 备份脚本从此每天报错,直到有人处理

抢救就是让控制文件承认现实:

RMAN> CROSSCHECK ARCHIVELOG ALL;            -- 逐个核对文件在不在
RMAN> DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;  -- 把"失踪"的标记为删除

CROSSCHECK 把文件已不存在的归档标成 EXPIRED,DELETE EXPIRED 只清控制文件里的记录,不会再碰磁盘。

真正麻烦的是 rm 掉了还没备份过的归档:恢复链断了一段,只能接受不完全恢复(31 篇的场景)。所以 rm 归档之前,先确认它进过备份:

SELECT SEQUENCE#, BACKUP_COUNT FROM v$archived_log
WHERE DELETED = 'NO' ORDER BY SEQUENCE#;
-- BACKUP_COUNT = 0 的就是还没进过备份的,一个都不能删

六、自动清理脚本

/home/oracle/scripts/arch_clean.sh:

#!/bin/bash
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export ORACLE_SID=orcl
export PATH=$ORACLE_HOME/bin:$PATH

rman target / log=/home/oracle/scripts/arch_clean.log <<EOF
CROSSCHECK ARCHIVELOG ALL;
BACKUP ARCHIVELOG ALL NOT BACKED UP 1 TIMES DELETE INPUT;
DELETE NOPROMPT OBSOLETE;
EXIT;
EOF

先 CROSSCHECK 兜住手工 rm 的坑,再"没备份的备一次并删源文件",最后按策略清掉 obsolete。

chmod +x /home/oracle/scripts/arch_clean.sh
crontab -e
# 每天凌晨 2 点执行
0 2 * * * /home/oracle/scripts/arch_clean.sh

脚本里特意不放 DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7' 这种硬删——有了 retention policy,DELETE OBSOLETE 会自己算,改策略不用改脚本。


七、FRA 还是自定义目录

维度FRA自定义目录
目录结构自动按天分子目录平铺,自己组织
空间保护有 db_recovery_file_dest_size 上限,超了报 ORA-00257 并挂起归档靠操作系统,盘满连着整个盘遭殃
自动清理DELETE OBSOLETE 配合好,还能算出可回收量同样可用 RMAN,但没有统一视图
适合中小库、单机、不想维护脚本量特别大、要归档到二级存储、多目的地分发

用法上两者不冲突:log_archive_dest_1 指向自定义目录的同时,log_archive_dest_2 可以再指向 FRA,双写两份提高安全性。

FRA 记得把上限给足(默认只有几 GB):

ALTER SYSTEM SET db_recovery_file_dest_size = 200G SCOPE=BOTH;

✅ 亮点:把归档清理从"应急 rm"升级为"retention policy + RMAN + crontab"的日常流程,BACKUP ... NOT BACKED UP N TIMES DELETE INPUT 一条命令封死"没备份就删"的漏洞;手工 rm 的事故给了完整的 crosscheck 收场方案。扩展方向:归档下发到备库(DG 环境 standby 归档管理)、RMAN catalog 与控制文件记录保留期(CONTROL_FILE_RECORD_KEEP_TIME)的配合。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐