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 参数并修正输出重定向,同时补充注释说明各部分作用:

#!/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 点执行归档删除脚本
# 修复:使用 >> 追加标准输出,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,确保所有输出都能被记录,便于问题回溯。
  • 增加脚本执行状态检查:可在脚本末尾增加退出码检查或发送执行结果通知,确保每次执行都有明确的结果反馈。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐