必须查v$recovery_file_dest和v$flash_recovery_area_usage确认FRA真实使用率,而非依赖df -h;清理归档需先CROSSCHECK再DELETE EXPIRED,DELETE OBSOLETE与DELETE EXPIRED用途不同,不可混用。

查清FRA真实使用率,别信df -h
ORA-19809报错时,df -h显示磁盘还有空间,但RMAN仍失败——这不是假象,而是FRA的db_recovery_file_dest_size逻辑配额耗尽了。必须进数据库查真实占用:
-
v$recovery_file_dest给出SPACE_LIMIT(即当前配额)和SPACE_USED,算出实际百分比 -
v$flash_recovery_area_usage告诉你哪类文件占大头:如果ARCHIVED LOG占比超95%,说明归档没清理;BACKUP PIECE持续增长,则RMAN保留策略太松 - 注意
v$recovery_file_dest.name字段才是FRA实际路径,确认该路径所在文件系统真有余量,而非只是挂载点空闲
RMAN清理归档日志必须先CROSSCHECK再DELETE
手动rm归档日志后df -h不释放空间,是因为控制文件和RMAN资料库还存着元数据记录。物理删了,Oracle“不知道”,FRA使用率不会下降。
- 先执行
CROSSCHECK ARCHIVELOG ALL:把OS上已删但控制文件还记着的归档标为EXPIRED - 再执行
DELETE NOPROMPT EXPIRED ARCHIVELOG ALL:只删标记为EXPIRED的记录,安全无风险 - 若需强制清理旧归档(如业务允许丢7天内数据),用
DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-7',但必须确保这些归档未被任何有效备份依赖 - 跳过
CROSSCHECK直接DELETE会报no archived log of thread 1 with sequence # found
DELETE OBSOLETE和DELETE EXPIRED不能混用
两者清理对象完全不同,混用会导致误删或漏清:
-
DELETE OBSOLETE按当前RMAN保留策略(如CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS)判断哪些归档/备份已无恢复价值,再删除 -
DELETE EXPIRED只删CROSSCHECK后状态为EXPIRED的归档(即物理文件已丢失,但控制文件还有记录) - 生产环境建议顺序执行:
REPORT OBSOLETE看清单 →DELETE NOPROMPT OBSOLETE→CROSSCHECK ARCHIVELOG ALL→DELETE NOPROMPT EXPIRED ARCHIVELOG ALL - 自动脚本里最容易漏掉
CROSSCHECK,长期运行后会出现“已删文件仍占FRA配额”的假满现象
清理后必须LIST RECOVERY AREA确认空间释放
别只信DELETE命令输出的“deleted”字样,它只表示RMAN发出了删除指令,不代表空间已回收。
- 执行完清理后,立刻运行
LIST RECOVERY AREA,查看FRA中剩余文件列表和空间统计 - 如果
v$recovery_file_dest中SPACE_USED没下降,说明有文件没真正清除,可能因归档还在被DataGuard备库需要、或闪回日志未触发自动回收 - 特别注意:
FLASHBACK LOG不受RMAN保留策略控制,它由FRA空间压力触发自动回收,DELETE OBSOLETE对它无效


















