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,确保所有输出都能被记录,便于问题回溯。
  • 增加脚本执行状态检查:可在脚本末尾增加退出码检查或发送执行结果通知,确保每次执行都有明确的结果反馈。
相关推荐
codigger9 小时前
MySQL 深分页优化:limit 100000, 10 慢在哪,怎么救
数据库·sql·mysql·程序员
麦壳饼9 小时前
SonnetDB 5.0 正式发布:增强 SQL 与事务,开放九模型 MCP 读写
数据库·人工智能·sql·sonnetdb
Decay__19 小时前
18_MySQL 智能巡检方案 —— 巡检项清单 / 一键巡检脚本 / 健康评分
运维·数据库·sql·mysql·架构
java_logo19 小时前
Docker 部署 Liquibase:轻松搭建数据库变更管理
数据库·docker·容器·数据库管理·liquibase·轩辕镜像·数据库变更
凤凰院凶涛QAQ20 小时前
《MySQL内核拆解:从SQL到InnoDB》(四) : 联合查询 & 视图
数据库·sql·mysql
码农小河6620 小时前
基于SSM+JSP的高校专业信息管理系统【附源码+数据库】
java·开发语言·数据库
张小姐的猫20 小时前
【MySQL】访问 & 数据流动原理
android·数据库·mysql·adb·1024程序员节
这个DBA有点耶1 天前
信创场景下数据同步软件怎么选?对比开源CDC与原生闭环工具的结构性差异
数据库·mysql·架构
多客:duokelijie1 天前
代练订单系统选型思路:跨品类游戏接入、订单分层管理、自动结算逻辑拆解!
数据库·mysql·微信小程序·前端框架·uni-app·php·持续部署