Oracle 11.2.0.1.0版本DBMS SCHEDULER作业邮件通知失效问题
排查Oracle 11g DBMS_SCHEDULER作业邮件通知失效问题
先看你提供的作业创建语句,里面完全没配置邮件通知相关参数——这大概率是核心原因!咱们一步步来排查解决:
1. 先搞定DBMS_SCHEDULER邮件的基础配置
Oracle调度器的邮件功能依赖内置的SCHEDULER$_MAILER组件,必须先配置SMTP服务器和发件人信息:
-- 替换为你的SMTP服务器地址(比如smtp.yourcompany.com:25) BEGIN SYS.DBMS_SCHEDULER.set_attribute( name => 'SCHEDULER$_MAILER', attribute => 'SMTP_SERVER', value => 'smtp.yourcompany.com:25' ); -- 设置发件人邮箱(要符合SMTP服务器的要求) SYS.DBMS_SCHEDULER.set_attribute( name => 'SCHEDULER$_MAILER', attribute => 'FROM_ADDRESS', value => 'oracle_scheduler@yourcompany.com' ); END; /
如果你的SMTP需要账号认证,Oracle 11gR2支持补充配置:
BEGIN SYS.DBMS_SCHEDULER.set_attribute( name => 'SCHEDULER$_MAILER', attribute => 'SMTP_USERNAME', value => 'your_smtp_account' ); SYS.DBMS_SCHEDULER.set_attribute( name => 'SCHEDULER$_MAILER', attribute => 'SMTP_PASSWORD', value => 'your_smtp_password' ); END; /
2. 给你的作业添加邮件通知规则
你之前的创建语句只定义了作业执行逻辑,没加通知触发规则,需要用ADD_JOB_EMAIL_NOTIFICATION配置:
-- 替换成你的实际作业名(可以从DBA_SCHEDULER_JOBS里查询生成的JOBxxxx)和收件人邮箱 BEGIN SYS.DBMS_SCHEDULER.add_job_email_notification( job_name => 'JOB12345', -- 你的作业名称 recipients => 'your_email@yourcompany.com', subject => '调度作业通知:%job_name% - %status%', body => '作业%job_name%执行状态:%status%,执行时间:%run_date%', events => 'JOB_FAILED, JOB_SUCCEEDED, JOB_MISSED' -- 指定要通知的事件类型 ); END; /
如果后续要修改通知内容,用SET_JOB_EMAIL_NOTIFICATION;要移除则用REMOVE_JOB_EMAIL_NOTIFICATION。
3. 检查UTL_MAIL组件是否正常(调度器邮件依赖它)
DBMS_SCHEDULER的邮件底层用的是UTL_MAIL包,得确保这个包已启用并授权:
-- 检查UTL_MAIL是否有效 SELECT object_name FROM dba_objects WHERE object_name = 'UTL_MAIL' AND status = 'VALID'; -- 给作业所有者授予UTL_MAIL执行权限(如果是普通用户创建的作业) GRANT EXECUTE ON UTL_MAIL TO your_job_owner;
如果UTL_MAIL没安装,需要用SYS权限执行$ORACLE_HOME/rdbms/admin/utlmail.sql和prvtmail.plb脚本安装。
4. 查看作业日志找具体错误
如果配置完还是收不到邮件,查调度器日志定位问题:
-- 查看作业执行日志摘要 SELECT job_name, status, run_date, error# FROM dba_scheduler_job_log WHERE job_name = 'JOB12345'; -- 查看详细执行明细 SELECT * FROM dba_scheduler_job_run_details WHERE job_name = 'JOB12345' ORDER BY run_date DESC;
日志里如果出现SMTP连接失败、权限不足等提示,针对性解决即可。
5. 测试基础邮件发送功能
直接用UTL_MAIL发测试邮件,排除邮件服务器本身的问题:
BEGIN UTL_MAIL.send( sender => 'oracle_scheduler@yourcompany.com', recipients => 'your_email@yourcompany.com', subject => 'Oracle测试邮件', message => '这是一封测试邮件,用于验证SMTP配置是否正常。' ); END; /
如果这封邮件都收不到,先解决SMTP服务器配置或网络连通问题,再回到调度器配置。
6. 检查作业权限和日志级别
确保作业所有者有MANAGE SCHEDULER权限(SYS用户默认拥有,普通用户需要授权):
GRANT MANAGE SCHEDULER TO your_job_owner;
同时确保作业日志级别足够,保证通知事件被记录:
BEGIN SYS.DBMS_SCHEDULER.set_attribute( name => 'JOB12345', attribute => 'logging_level', value => DBMS_SCHEDULER.LOGGING_FULL ); END; /
按这些步骤排查下来,应该能找到邮件通知失效的根源并解决。
内容的提问来源于stack exchange,提问作者Parthiban
相关产品推荐
相关产品推荐

