Oracle归档自动删除任务失败

asm磁盘组arch告警使用率90%

经检查归档删除脚本未注释,操作系统日志无异常

进入磁盘组检查发现,归档未正常删除

手工运行归档删除脚本,报错如下

分析归档删除脚本发现delete expired archivelog all未添加noprompt

而且>/dev/null 2>>/tmp/b.log 会无法记录日志

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| --归档日志自动删除脚本 crontab -e 0 0 * * * sh /u01/script/del_arch.sh >/dev/null 2>>/tmp/b.log ----主库 mkdir -p /u01/script cd /u01/script vi del_arch.sh source /home/oracle/.bash_profile rman target / <<! crosscheck archivelog all; delete expired archivelog all; delete noprompt archivelog all completed before 'sysdate-2'; exit; ! |

修复后的完整归档删除脚本

针对上述问题,修复后的完整脚本示例如下,已添加 noprompt 参数并修正输出重定向,同时补充注释说明各部分作用:

bash 复制代码
#!/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 配置建议如下,将标准输出和错误输出都重定向到日志文件,确保所有执行信息都能被记录:

bash 复制代码
# 每天凌晨 0 点执行归档删除脚本
# 修复:使用 >> 追加标准输出,2>&1 将错误输出合并到同一日志文件
0 0 * * * sh /u01/script/del_arch.sh >>/tmp/b.log 2>&1

总结与建议

本次问题的根本原因是归档删除脚本中 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 2>&1,确保所有输出都能被记录,便于问题回溯。
  • 增加脚本执行状态检查:可在脚本末尾增加退出码检查或发送执行结果通知,确保每次执行都有明确的结果反馈。
相关推荐
cccccc语言我来了1 小时前
Linux (11) 进程控制
linux·运维·数据库
杨运交1 小时前
[079][消息模块]基于 Redis Stream 的高可靠消息队列实现——Spring Data Redis 实战解析
数据库·redis·spring
Leo.yuan1 小时前
2026穿透式监管系统选型避坑:数据接不进、风险穿不透、系统难联动,哪些平台能解决?
大数据·数据库
数据库小学妹1 小时前
MySQL内存占用过高怎么排查?分层定位与OOM根因
数据库·经验分享·mysql·内存·oom
刘胡子大叔2 小时前
旧 SQL 在新 PG 上能不能跑
数据库·sql
Elastic 中国社区官方博客2 小时前
教程:监控 Java 应用
java·开发语言·数据库·elasticsearch·搜索引擎·全文检索
xixingzhe22 小时前
秒杀库存三种缓存实现方案
数据库·redis·缓存
软件交付观察室2 小时前
数据大屏总数与明细为什么对不上?2026项目开发排查指南
软件测试·数据库·sql·sqlite·数据可视化