rman本身不支持邮件通知,告警邮件依赖oracle enterprise manager(em)agent扫描dba_outstanding_alerts并调用smtp发送,或通过dbms_scheduler+utl_mail自定义实现。

RMAN 本身不发邮件,告警邮件依赖 Oracle Enterprise Manager(EM)或自定义脚本触发。直接在 RMAN 里执行 SEND MAIL 或类似命令会报错——它压根没这个功能。你要的“自动邮件通知”,实际是靠数据库级告警机制 + 外部邮件通道实现的,不是 RMAN 配置项。
DBMS_SERVER_ALERT.SET_THRESHOLD 不会自动发邮件,只生成告警记录
调用 DBMS_SERVER_ALERT.SET_THRESHOLD 设置表空间或控制文件备份失败阈值后,Oracle 只会在 DBA_OUTSTANDING_ALERTS 视图里插入一条记录,不会发邮件。EM Agent 才是那个定期扫描这张表、匹配规则、调用邮件服务的角色。
- 必须确认
STATISTICS_LEVEL是TYPICAL或ALL,否则指标根本不采集 - 告警指标名必须带空格和大小写,比如
'Tablespace Used Space',写成'tablespace_used_space'就无效 -
object_name必须是大写的表空间名(如'USERS'),小写或带引号都失败 - 临时表空间(
TEMP)不支持TABLESPACE_UTILIZATION告警,得自己写 SQL +DBMS_SCHEDULER定时检查
EM Agent 是邮件链路的关键中间件,且默认不启用邮件功能
即使 EM 控制台里看到告警已触发,DBA_OUTSTANDING_ALERTS 有数据,若 Agent 没配 SMTP 或没启用邮件通知,照样收不到邮件。常见断点:
- Agent 进程未运行:
emctl status agent返回Agent is Not Running→ 先emctl start agent - SMTP 服务器未配置:
emctl config agent email -email <your> -smtp <smtp.example.com>:25</smtp.example.com></your> - 邮件模板未启用:EM 控制台 → Setup → Notification Methods → Email → Enable
- 告警规则未绑定邮箱:在 EM 的 Alert Rules 页面,找到对应规则(如 “RMAN Backup Failed”),点击 Edit → Notification → Add Recipient
没有 EM 的环境,只能用 DBMS_SCHEDULER + UTL_MAIL 手动补全
很多生产库禁用 EM(安全策略或资源限制),这时要实现“RMAN 备份失败就发邮件”,就得绕开告警框架,自己监听备份日志或查询 V$RMAN_STATUS:
- 写一个 PL/SQL 过程,查
SELECT * FROM V$RMAN_STATUS WHERE STATUS = 'FAILED' AND END_TIME > SYSDATE-1/24 - 用
UTL_MAIL.SEND发送邮件,注意:UTL_MAIL需提前授权:GRANT EXECUTE ON UTL_MAIL TO your_backup_user - 通过
DBMS_SCHEDULER.CREATE_JOB每 5 分钟跑一次该过程,别用DBMS_JOB(11g 已过时) - 关键陷阱:
UTL_MAIL默认不支持中文主题或正文,需用UTL_RAW.CAST_TO_RAW转码,否则邮件乱码或发送失败
真正卡住人的地方从来不是“怎么写发邮件的代码”,而是权限链太长:Oracle 用户要能读 V$RMAN_STATUS,要有 UTL_MAIL 执行权,OS 层要允许连接 SMTP 端口,防火墙得放行,而 EM Agent 还可能因为 ORACLE_HOME 环境变量没设对根本起不来——每个环节断掉,邮件就静默消失。











