Oracle归档自动删除任务失败 asm磁盘组arch告警使用率90%经检查归档删除脚本未注释操作系统日志无异常进入磁盘组检查发现归档未正常删除手工运行归档删除脚本报错如下分析归档删除脚本发现delete expired archivelog all未添加noprompt而且/dev/null 2/tmp/b.log 会无法记录日志--归档日志自动删除脚本crontab -e0 0 * * * sh /u01/script/del_arch.sh /dev/null 2/tmp/b.log----主库mkdir -p /u01/scriptcd /u01/scriptvi del_arch.shsource /home/oracle/.bash_profilerman target / !crosscheck archivelog all;delete expired archivelog all;delete noprompt archivelog all completed before sysdate-2;exit;!修复后的完整归档删除脚本针对上述问题修复后的完整脚本示例如下已添加noprompt参数并修正输出重定向同时补充注释说明各部分作用#!/bin/bash # # 归档日志自动删除脚本修复版 # 功能定期清理过期归档日志防止 ASM 磁盘组使用率过高 # 加载 Oracle 环境变量必须否则 rman 无法连接 source /home/oracle/.bash_profile 进入 RMAN 交互模式通过 here-document 传入命令 rman target / ! 交叉检查归档日志将物理上已不存在的归档标记为 expired crosscheck archivelog all; 删除已过期expired的归档日志 关键修复添加 noprompt避免 RMAN 等待交互确认导致脚本卡住 delete noprompt expired archivelog all; 删除 2 天前已完成的归档日志同样使用 noprompt 避免交互等待 delete noprompt archivelog all completed before sysdate-2; 退出 RMAN exit; ! 脚本执行结束输出完成提示 echo 归档日志清理完成$(date %Y-%m-%d %H:%M:%S)对应的 crontab 配置建议如下将标准输出和错误输出都重定向到日志文件确保所有执行信息都能被记录# 每天凌晨 0 点执行归档删除脚本 # 修复使用 追加标准输出21 将错误输出合并到同一日志文件 0 0 * * * sh /u01/script/del_arch.sh /tmp/b.log 21总结与建议本次问题的根本原因是归档删除脚本中delete expired archivelog all未添加noprompt参数。在 RMAN 交互式执行时该命令会等待用户确认而脚本通过 crontab 定时运行时没有交互终端导致命令一直处于等待状态归档日志无法正常删除最终引发 ASM 磁盘组使用率告警。此外脚本中/dev/null 2/tmp/b.log的输出重定向也存在隐患标准输出被丢弃错误输出追加到日志文件但 RMAN 的提示信息通常输出到标准输出因此即使脚本卡住日志中也无法记录到相关提示增加了问题排查的难度。为避免类似问题再次发生建议采取以下预防措施为删除命令添加 noprompt将delete expired archivelog all修改为delete noprompt expired archivelog all避免 RMAN 等待交互确认。定期检查脚本日志建议每周至少检查一次/tmp/b.log日志文件确认归档删除任务是否正常执行完毕及时发现异常。设置告警阈值为 ASM 磁盘组使用率设置合理的告警阈值如 80% 预警、90% 严重告警在磁盘空间耗尽前提前介入处理。确保 crontab 输出重定向正确建议将标准输出和错误输出都重定向到日志文件例如0 0 * * * sh /u01/script/del_arch.sh /tmp/b.log 21确保所有输出都能被记录便于问题回溯。增加脚本执行状态检查可在脚本末尾增加退出码检查或发送执行结果通知确保每次执行都有明确的结果反馈。