如何为DBMS Scheduler作业设置超时长告警?能否用Oracle EM实现?
DBMS Scheduler作业运行超时告警实现方案
是否可以用Oracle Enterprise Manager实现?
完全可以,而且是推荐的便捷方案,无需编写大量代码,通过可视化配置即可完成:
EM配置步骤
- 登录EM控制台,进入目标数据库的调度程序 -> 作业页面
- 找到需要监控的作业,进入详情页后切换到告警标签
- 点击「创建告警规则」,选择「作业运行时长超过指定阈值」作为触发条件,设置阈值为150分钟(即2.5小时)
- 在通知配置中绑定你的邮件、短信或企业消息渠道(EM内置通知系统支持多种方式)
- 保存规则后,EM会自动实时监控作业状态,一旦运行时长超出阈值立即触发通知
纯数据库原生实现方案(无EM环境适用)
如果没有EM,可通过DBMS Scheduler事件触发器+定时监控作业实现,以下是具体步骤:
1. 创建监控数据存储表
用于记录作业启动时间和运行状态:
CREATE TABLE job_run_monitor ( job_name VARCHAR2(100) PRIMARY KEY, start_time TIMESTAMP NOT NULL, status VARCHAR2(20) DEFAULT 'RUNNING' );
2. 编写作业启动事件触发器
监听作业启动事件,自动记录启动时间:
CREATE OR REPLACE TRIGGER trg_job_start AFTER EVENT 'JOB_STARTED' ON SCHEMA DECLARE v_job_name VARCHAR2(100); BEGIN SELECT attribute_value INTO v_job_name FROM sys.scheduler$_event_details WHERE attribute_name = 'JOB_NAME'; MERGE INTO job_run_monitor jrm USING (SELECT v_job_name AS job_name, SYSTIMESTAMP AS start_time FROM dual) src ON (jrm.job_name = src.job_name) WHEN MATCHED THEN UPDATE SET start_time = src.start_time, status = 'RUNNING' WHEN NOT MATCHED THEN INSERT (job_name, start_time) VALUES (src.job_name, src.start_time); END; /
3. 编写超时检测存储过程
计算运行时长,超过阈值则发送通知(这里用UTL_MAIL为例,需提前配置邮件服务器):
CREATE OR REPLACE PROCEDURE check_job_timeout IS CURSOR c_running_jobs IS SELECT job_name, start_time FROM job_run_monitor WHERE status IN ('RUNNING', 'ALERT_SENT'); v_elapsed INTERVAL DAY TO SECOND; v_total_minutes NUMBER; BEGIN FOR rec IN c_running_jobs LOOP v_elapsed := SYSTIMESTAMP - rec.start_time; v_total_minutes := EXTRACT(HOUR FROM v_elapsed)*60 + EXTRACT(MINUTE FROM v_elapsed) + EXTRACT(SECOND FROM v_elapsed)/60; -- 判断是否超过2.5小时(150分钟) IF v_total_minutes > 150 THEN -- 发送告警邮件 UTL_MAIL.SEND( sender => 'dba@yourdomain.com', recipients => 'your-alert-list@yourdomain.com', subject => '【作业超时告警】' || rec.job_name, message => '作业 ' || rec.job_name || ' 已运行 ' || ROUND(v_total_minutes, 2) || ' 分钟,超过阈值150分钟。' ); -- 更新状态避免重复发送 UPDATE job_run_monitor SET status = 'ALERT_SENT' WHERE job_name = rec.job_name; END IF; END LOOP; COMMIT; END; /
4. 创建定时监控作业
每10分钟运行一次检测过程,确保及时发现超时:
BEGIN DBMS_SCHEDULER.CREATE_JOB( job_name => 'CHECK_JOB_TIMEOUT_MONITOR', job_type => 'STORED_PROCEDURE', job_action => 'check_job_timeout', start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=MINUTELY;INTERVAL=10', enabled => TRUE, auto_drop => FALSE ); END; /
补充说明
- 若不需要邮件通知,可替换为调用企业内部通知API、写告警日志到指定表等方式
- 需确保数据库用户有
CREATE TRIGGER、EXECUTE ON DBMS_SCHEDULER、EXECUTE ON UTL_MAIL等权限
最佳方式总结
- 若已部署Oracle Enterprise Manager,优先使用EM配置:操作简单、可视化,还能统一管理所有数据库作业的告警规则
- 无EM环境时,采用触发器+定时监控作业的原生方案,稳定性高且无需额外工具
内容的提问来源于stack exchange,提问作者Kuwali
相关产品推荐
相关产品推荐

