You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:35:15