rman归档日志备份必须先crosscheck再delete expired,再backup archivelog all delete input,并配环境变量、权限、路径检查及兜底清理,否则易报错或归档堆积。
rman 不能只备份归档日志而不做任何校验或清理,但可以安全、可控地只执行归档日志备份任务——关键在于脚本结构和 crosscheck/delete 的组合使用。
为什么不能直接写 backup archivelog all 就完事
裸写 backup archivelog all 很危险:它会尝试备份所有归档(包括已被 RMAN 标记为 EXPIRED 或已物理删除但控制文件里还留着记录的),极易报错 RMAN-06059: expected archived log not found;更糟的是,如果归档路径里混入了非 Oracle 生成的临时文件,RMAN 可能卡住或静默跳过部分日志。
必须前置 crosscheck archivelog all,再跟 delete noprompt expired archivelog all 清理元数据残留。这是归档备份脚本的“安全带”。
- 每次运行前先同步控制文件与磁盘实际状态
- 避免因人工删归档、挂载异常、NFS 断连等导致元数据脏
- 不加
noprompt会导致脚本在 crontab 中卡住等待交互
归档备份脚本中必须显式指定 delete input 或 delete all input
只备份不删,归档目录几天就会撑爆。Oracle 不会自动清理已备份的归档,除非你明确告诉它。
backup archivelog all delete input 是最常用写法,但注意:
– 它只删那些「本次成功备份」的归档;
– 如果某段归档因权限/空间/IO 失败没备上,它不会被删,下次还会重试;
– 若想激进些,可用 backup archivelog all not backed up 1 times delete all input,表示只备份尚未被备份过的归档,并全部删掉。
- 推荐搭配
delete noprompt archivelog all completed before 'sysdate-7'做兜底,防止某次备份失败导致归档堆积 - 不要依赖
CONFIGURE ARCHIVELOG DELETION POLICY来自动删——它只在 backup+delete 同时发生时生效,单独 delete 命令不受其约束
crontab 定时执行时,环境变量缺失是最高频失败原因
直接在 oracle 用户下 crontab -e 写 0 */6 * * * rman cmdfile=xxx.rcv 会失败:cron 默认只加载极简 shell 环境,$ORACLE_HOME、$ORACLE_SID 全都为空,rman 命令根本找不到。
正确做法是:把所有环境变量 export 到脚本头部,而不是指望 crontab 继承登录态。
- 脚本开头必须有
export ORACLE_SID=xxx、export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1、export PATH=$ORACLE_HOME/bin:$PATH - 避免用
~或$HOME写路径,cron 下可能解析异常,全用绝对路径 - 测试时用
su - oracle -c "/path/to/backup_arch.sh"模拟 cron 环境,比直接 bash 执行更真实
归档备份路径权限和磁盘空间比数据库备份更易出问题
归档日志写入频率高、单次体积小、IO 频繁,对文件系统敏感。常见问题不是备份失败,而是备份后无法写新归档。
检查点要落在归档路径本身:
– 目录属主必须是 oracle:oinstall,不能是 root(尤其用 root 创建后忘了 chown);
– df -h 看的是挂载点,但归档可能写在子目录(如 /archivelog/orcl),得确认该子目录所在分区是否满;
– 如果用了 NFS,确保 mount 选项含 hard,intr,noac,否则网络抖动时 Oracle 可能 hang 在归档写入上。
- 备份脚本末尾建议加一句
ls -lt /archivelog | head -5到日志,方便快速确认最新归档是否还在持续生成 - 别把归档路径和 RMAN 备份路径放在同一块盘——一次 IO 峰值可能拖垮两者
归档备份真正难的不是语法,而是让 crosscheck → backup → delete 这个链条在无人值守下稳定跑通七天以上。最容易被忽略的是:每次修改归档路径或挂载方式后,必须手动执行一次脚本并检查日志里有没有 deleted 123 expired archivelog(s) 这类清理动作——没有,说明元数据没对齐,后续定时任务大概率失败。











