RMAN本身不发邮件,因其不内置邮件功能且不调用系统命令;需通过Shell脚本捕获其退出码($?),再分支调用mailx等命令实现通知,并注意crontab环境变量、SMTP配置及日志路径安全等问题。
为什么 RMAN 本身不发邮件
rman 是 oracle 的备份恢复工具,它不内置邮件发送能力,也不调用系统命令。所谓“自动提醒”,本质是让 rman 执行完后,由外部 shell 或操作系统级脚本触发邮件发送逻辑。直接在 rman 命令块里写 mail 或 sendmail 会报错或静默失败。
用 RMAN + Shell 脚本组合实现通知
核心思路:把 RMAN 备份封装进 Shell 脚本,利用 $? 捕获 RMAN 进程退出码,再根据成功(0)或失败(非0)分支调用邮件命令。
-
RMAN必须以非交互方式运行,推荐用rman target / @backup.rman或 here-document 方式传入命令 - Shell 脚本中需显式检查
RMAN的退出状态,不能只看日志文件是否存在 - 邮件命令优先用
mailx(Linux/Unix 通用),避免依赖sendmail服务是否启用 - 示例关键片段:
rman target / @/u01/scripts/full_backup.rman > /u01/logs/rman_$(date +%Y%m%d).log 2>&1 if [ $? -eq 0 ]; then echo "RMAN backup completed successfully." | mailx -s "[ORACLE] Backup OK $(date +%Y-%m-%d)" admin@example.com else echo "RMAN backup FAILED. Check log: /u01/logs/rman_$(date +%Y%m%d).log" | mailx -s "[ORACLE] Backup FAILED $(date +%Y-%m-%d)" admin@example.com fi
常见失败点:邮件发不出的几个硬坑
很多脚本本地测试能发邮件,但被 crontab 调用时就静默失败——根本原因在于环境变量缺失和权限隔离。
-
crontab默认不加载用户 profile,mailx可能找不到,需在脚本开头显式指定路径,如/bin/mailx或/usr/bin/mailx - Oracle 用户(如
oracle)可能没配置 SMTP 认证,mailx默认走本地sendmail,而多数生产服务器禁用了该服务;建议改用ssmtp或配置mailx -S smtp=... - 日志路径含空格或特殊字符会导致重定向失败,
>后面的路径务必用引号包裹 - RMAN 日志中若含大量二进制控制文件 dump,可能撑爆邮件正文长度限制,建议只在邮件正文中放摘要,附日志路径供人工查
更稳的做法:加个简单状态标记文件
仅靠退出码有时不够,比如 RMAN 报了 warning 但退出码仍是 0(如部分归档未删除),这时需要解析日志判断真实状态。一个轻量替代方案是让 RMAN 脚本末尾主动 touch 一个标记文件。
- 在
backup.rman最后一行加:host 'touch /u01/scripts/backup_success_$(date +%Y%m%d)'; - Shell 脚本中改为检查该文件是否存在且时间匹配,比单纯依赖
$?更可靠 - 注意
host命令在 RMAN 中执行的是 OS shell,需确保 Oracle 用户对目标目录有写权限 - 记得清理旧标记文件,避免堆积,例如加一句:
find /u01/scripts -name "backup_success_*" -mtime +7 -delete
crontab,几乎必掉一次坑。


















