惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
V
Visual Studio Blog
C
Check Point Blog
Google DeepMind News
Google DeepMind News
S
SegmentFault 最新的问题
博客园 - 聂微东
量子位
T
Tailwind CSS Blog
罗磊的独立博客
I
InfoQ
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Y
Y Combinator Blog
L
LangChain Blog
小众软件
小众软件
Engineering at Meta
Engineering at Meta
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Security Latest
Security Latest
M
MIT News - Artificial intelligence
Know Your Adversary
Know Your Adversary
MongoDB | Blog
MongoDB | Blog
Google DeepMind News
Google DeepMind News
大猫的无限游戏
大猫的无限游戏
H
Help Net Security
爱范儿
爱范儿
T
The Exploit Database - CXSecurity.com
有赞技术团队
有赞技术团队
V
Vulnerabilities – Threatpost
Martin Fowler
Martin Fowler
A
Arctic Wolf
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 司徒正美
Cyberwarzone
Cyberwarzone
阮一峰的网络日志
阮一峰的网络日志
The Hacker News
The Hacker News
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
GbyAI
GbyAI
Latest news
Latest news
云风的 BLOG
云风的 BLOG
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
腾讯CDC
AWS News Blog
AWS News Blog
aimingoo的专栏
aimingoo的专栏
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
Lohrmann on Cybersecurity
博客园 - Franky
S
Securelist
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Threatpost
美团技术团队

良的世界

达梦数据库主备集群动态增加实时备库 – 良的世界 达梦数据库SQL报错之远程操作符执行失败 – 良的世界 达梦数据库的审计功能 – 良的世界 达梦数据库在同一服务器上配置多个 AP 服务 – 良的世界 达梦数据库中常用的系统视图 – 良的世界 达梦数据库服务器的磁盘I/O监控指南 – 良的世界 SQL优化之注入HINT – 良的世界 达梦数据库的重做日志 – 良的世界 达梦数据库授予其他用户下创建表的权限 – 良的世界 达梦的回滚表空间ROLL – 良的世界 Windows环境安装dmPython时报错:error: Microsoft Visual C++ 14.0 or greater is required. – 良的世界
达梦数据库的作业系统 – 良的世界
shine · 2026-02-27 · via 良的世界

本文于 107 天前发布,最后更新于 6 天前

一、作业系统三要素

  • 作业(Job):要执行的任务,包含一个或多个步骤。
  • 调度(Schedule):定义作业何时执行、执行频率、有效时间范围。
  • 警报(Alert):当作业执行中发生特定事件(如失败)时触发。
  • 操作员(Operator):接收警报通知的人员(通过邮件或网络)。

二、核心系统表(SYSJOB模式)

存储用户定义的作业信息

SELECT * FROM SYSJOB.SYSJOBS;

存储作业包括的所有步骤信息

SELECT * FROM SYSJOB.SYSJOBSTEPS;

存储作业的调度信息

SELECT * FROM SYSJOB.SYSJOBSCHEDULES;

说明:一个作业可以有多个调度,调度用来指定一个作业的执行情况,可以指定作业的执行方式及时间范围。SYSJOBSCHEDULES 表聚集关键字为 JOBID 及调度名,意味着对于一个指定的作业,不能具有同名的调度。

存储作业的执行情况的日志

SELECT * FROM SYSJOB.SYSJOBHISTORIES2;

说明:当一个作业执行完成后,会向这个表中插入一条作业执行情况的记录。
这个表中的所有记录都是由作业在运行过程中系统自动插入的,不是由用户来操作的。

存储作业步骤的执行情况的日志

SELECT * FROM SYSJOB.SYSSTEPHISTORIES2;

三、常用系统过程

  • 初始化代理:SP_INIT_JOB_SYS(1)
  • 销毁代理:SP_INIT_JOB_SYS(0)
  • 创建/修改/删除作业:SP_CREATE_JOB / SP_ALTER_JOB / SP_DROP_JOB
  • 开始/提交作业配置:SP_JOB_CONFIG_START / SP_JOB_CONFIG_COMMIT
  • 添加/修改/删除步骤:SP_ADD_JOB_STEP / SP_ALTER_JOB_STEP / SP_DROP_JOB_STEP
  • 添加/修改/删除调度:SP_ADD_JOB_SCHEDULE / SP_ALTER_JOB_SCHEDULE / SP_DROP_JOB_SCHEDULE
  • 清除历史日志:SP_JOB_CLEAR_HISTORIES
  • 立即执行作业:SP_DBMS_JOB_RUN

四、权限

  • 普通用户无操作作业的权限。
  • 授予 ADMIN JOB 权限:GRANT ADMIN JOB TO 用户名;
  • 只有 DBA 可以执行 SP_INIT_JOB_SYS

五、其他常用SQL

(1)查看某存储过程的是哪个作业调用的

SELECT A.ID,A.NAME,A."ENABLE",A.USERNAME,A.CREATETIME,A.MODIFYTIME,A.DESCRIBE,
B.LAST_DATE||' '||B.LAST_SEC LAST_TIME,B.NEXT_DATE||' '||B.NEXT_SEC NEXT_TIME,B.WHAT::VARCHAR
FROM SYSJOB.SYSJOBS A,SYSJOB.USER_JOBS B
WHERE A.ID=B.JOB AND B.WHAT LIKE '%call procname%';

(2)查看所有作业信息

--查看所有作业信息
SELECT A.ID,A.NAME,A."ENABLE",A.USERNAME,A.CREATETIME,A.MODIFYTIME,A.DESCRIBE,
B.LAST_DATE||' '||B.LAST_SEC LAST_TIME,B.NEXT_DATE||' '||B.NEXT_SEC NEXT_TIME,B.WHAT
FROM SYSJOB.SYSJOBS A,SYSJOB.USER_JOBS B
WHERE A.ID=B.JOB;

或者

-- 查看当前启用的作业及对应调度
SELECT A.NAME, A.ENABLE, B.NAME, B.ENABLE, B.STARTTIME, B.DURING_START_DATE, B.VALID
FROM SYSJOB.SYSJOBS A
JOIN SYSJOB.SYSJOBSCHEDULES B ON A.ID = B.JOBID
WHERE A.ENABLE = 1;

(3)查看所有作业的调度信息

SELECT
    SCHED.ID,
    SCHED.NAME AS SCHEDULE_NAME,          -- 调度名称
    JOB.NAME AS JOB_NAME,                 -- 作业名称
    SCHED.JOBID,
    CASE SCHED.ENABLE
        WHEN 1 THEN '启用'
        WHEN 0 THEN '禁用'
        ELSE '未知(' || TO_CHAR(SCHED.ENABLE) || ')'
    END AS ENABLE,
    CASE SCHED.TYPE
        WHEN 0 THEN '只执行一次'
        WHEN 1 THEN '按天'
        WHEN 2 THEN '按周'
        WHEN 3 THEN '按月(指定日期)'
        WHEN 4 THEN '按月(第一周第几天)'
        WHEN 5 THEN '按月(第二周第几天)'
        WHEN 6 THEN '按月(第三周第几天)'
        WHEN 7 THEN '按月(第四周第几天)'
        WHEN 8 THEN '按月(最后一周第几天)'
        ELSE TO_CHAR(SCHED.TYPE)
    END AS TYPE,
    -- FREQ_INTERVAL
    CASE SCHED.TYPE
        WHEN 0 THEN NULL
        WHEN 1 THEN 
            CASE WHEN SCHED.FREQ_INTERVAL = 1 THEN '每天'
                 ELSE '每隔 ' || TO_CHAR(SCHED.FREQ_INTERVAL) || ' 天'
            END
        WHEN 2 THEN 
            CASE WHEN SCHED.FREQ_INTERVAL = 1 THEN '每周'
                 ELSE '每隔 ' || TO_CHAR(SCHED.FREQ_INTERVAL) || ' 周'
            END
        WHEN 3 THEN 
            CASE WHEN SCHED.FREQ_INTERVAL = 1 THEN '每月(指定日期)'
                 ELSE '每隔 ' || TO_CHAR(SCHED.FREQ_INTERVAL) || ' 个月(指定日期)'
            END
        WHEN 4 THEN 
            CASE WHEN SCHED.FREQ_INTERVAL = 1 THEN '每月(第一周第几天)'
                 ELSE '每隔 ' || TO_CHAR(SCHED.FREQ_INTERVAL) || ' 个月(第一周第几天)'
            END
        WHEN 5 THEN 
            CASE WHEN SCHED.FREQ_INTERVAL = 1 THEN '每月(第二周第几天)'
                 ELSE '每隔 ' || TO_CHAR(SCHED.FREQ_INTERVAL) || ' 个月(第二周第几天)'
            END
        WHEN 6 THEN 
            CASE WHEN SCHED.FREQ_INTERVAL = 1 THEN '每月(第三周第几天)'
                 ELSE '每隔 ' || TO_CHAR(SCHED.FREQ_INTERVAL) || ' 个月(第三周第几天)'
            END
        WHEN 7 THEN 
            CASE WHEN SCHED.FREQ_INTERVAL = 1 THEN '每月(第四周第几天)'
                 ELSE '每隔 ' || TO_CHAR(SCHED.FREQ_INTERVAL) || ' 个月(第四周第几天)'
            END
        WHEN 8 THEN 
            CASE WHEN SCHED.FREQ_INTERVAL = 1 THEN '每月(最后一周第几天)'
                 ELSE '每隔 ' || TO_CHAR(SCHED.FREQ_INTERVAL) || ' 个月(最后一周第几天)'
            END
        ELSE TO_CHAR(SCHED.FREQ_INTERVAL)
    END AS FREQ_INTERVAL,
    -- FREQ_SUB_INTERVAL
    CASE
        WHEN SCHED.FREQ_SUB_INTERVAL IS NULL THEN NULL
        WHEN SCHED.TYPE = 2 THEN
            RTRIM(
                CASE WHEN BITAND(SCHED.FREQ_SUB_INTERVAL, 1) = 1 THEN '周日,' ELSE '' END ||
                CASE WHEN BITAND(SCHED.FREQ_SUB_INTERVAL, 2) = 2 THEN '周一,' ELSE '' END ||
                CASE WHEN BITAND(SCHED.FREQ_SUB_INTERVAL, 4) = 4 THEN '周二,' ELSE '' END ||
                CASE WHEN BITAND(SCHED.FREQ_SUB_INTERVAL, 8) = 8 THEN '周三,' ELSE '' END ||
                CASE WHEN BITAND(SCHED.FREQ_SUB_INTERVAL, 16) = 16 THEN '周四,' ELSE '' END ||
                CASE WHEN BITAND(SCHED.FREQ_SUB_INTERVAL, 32) = 32 THEN '周五,' ELSE '' END ||
                CASE WHEN BITAND(SCHED.FREQ_SUB_INTERVAL, 64) = 64 THEN '周六,' ELSE '' END,
            ',')
        WHEN SCHED.TYPE = 3 THEN TO_CHAR(SCHED.FREQ_SUB_INTERVAL) || '号'
        WHEN SCHED.TYPE IN (4,5,6,7,8) THEN
            CASE SCHED.FREQ_SUB_INTERVAL
                WHEN 1 THEN '周一' WHEN 2 THEN '周二' WHEN 3 THEN '周三'
                WHEN 4 THEN '周四' WHEN 5 THEN '周五' WHEN 6 THEN '周六'
                WHEN 7 THEN '周日' ELSE TO_CHAR(SCHED.FREQ_SUB_INTERVAL)
            END
        ELSE TO_CHAR(SCHED.FREQ_SUB_INTERVAL)
    END AS FREQ_SUB_INTERVAL,
    -- FREQ_MINUTE_INTERVAL
    CASE
        WHEN SCHED.FREQ_MINUTE_INTERVAL = 0 THEN '一天内执行一次'
        WHEN SCHED.FREQ_MINUTE_INTERVAL > 32768 THEN '每 ' || TO_CHAR(SCHED.FREQ_MINUTE_INTERVAL - 32768) || ' 秒'
        ELSE '每 ' || TO_CHAR(SCHED.FREQ_MINUTE_INTERVAL) || ' 分钟'
    END AS FREQ_MINUTE_INTERVAL,
    SCHED.STARTTIME,
    SCHED.ENDTIME,
    SCHED.DURING_START_DATE,
    SCHED.DURING_END_DATE,
    SCHED.SCHNAME,
    SCHED.TRIGNAME,
    CASE SCHED.VALID
        WHEN 'Y' THEN '合法'
        WHEN 'N' THEN '不合法'
        ELSE '未知'
    END AS VALID,
    SCHED.DESCRIBE
FROM SYSJOB.SYSJOBSCHEDULES SCHED
LEFT JOIN SYSJOB.SYSJOBS JOB ON SCHED.JOBID = JOB.ID;

(4)查看作业运行历史信息[作业量大谨慎执行]

SELECT *
FROM SYSJOB.SYSSTEPHISTORIES2 A
WHERE (SELECT COUNT(*)
          FROM SYSJOB.SYSSTEPHISTORIES2 B
         WHERE B.NAME = A.NAME
           AND B.EXEC_ID >= A.EXEC_ID) <= 10
ORDER BY A.START_TIME DESC,A.NAME;

查询最近10次作业执行历史(含执行时间)

SELECT ID, NAME, ERRINFO, START_TIME, END_TIME,
       DATEDIFF(SS, START_TIME, END_TIME) USE_TIME
FROM (
    SELECT A.ID, A.NAME, B.ERRINFO, B.START_TIME, B.END_TIME,
           ROW_NUMBER() OVER(PARTITION BY A.NAME ORDER BY B.START_TIME DESC) RN
    FROM SYSJOB.SYSJOBS A
    JOIN SYSJOB.SYSJOBHISTORIES2 B ON A.NAME = B.NAME
) WHERE RN <= 10;

(5)只查看某个作业的历史信息

SELECT *
FROM SYSJOB.SYSSTEPHISTORIES2 A
WHERE (SELECT COUNT(*)
          FROM SYSJOB.SYSSTEPHISTORIES2 B
         WHERE B.NAME = A.NAME
           AND B.EXEC_ID >= A.EXEC_ID) <= 10 
           AND NAME = '作业名'
ORDER BY A.START_TIME DESC,A.NAME;

查询最近10次作业执行历史(含执行时间)

SELECT ID, NAME, ERRINFO, START_TIME, END_TIME,
       DATEDIFF(SS, START_TIME, END_TIME) USE_TIME
FROM (
    SELECT A.ID, A.NAME, B.ERRINFO, B.START_TIME, B.END_TIME,
           ROW_NUMBER() OVER(PARTITION BY A.NAME ORDER BY B.START_TIME DESC) RN
    FROM SYSJOB.SYSJOBS A
    JOIN SYSJOB.SYSJOBHISTORIES2 B ON A.NAME = B.NAME
    WHERE A.NAME = '作业名称'
) WHERE RN <= 10;

(6)查看某作业的历史耗时

SELECT
    TO_CHAR(A.START_TIME, 'YYYY-MM') AS MONTH,
    AVG(DATEDIFF(SECOND, A.START_TIME, A.END_TIME)) AS AVG_DURATION_SEC,
    MIN(DATEDIFF(SECOND, A.START_TIME, A.END_TIME)) AS MIN_SEC,
    MAX(DATEDIFF(SECOND, A.START_TIME, A.END_TIME)) AS MAX_SEC,
    COUNT(*) AS EXEC_COUNT
FROM SYSJOB.SYSSTEPHISTORIES2 A
WHERE A.NAME = 'proc_contracttopay'
GROUP BY TO_CHAR(A.START_TIME, 'YYYY-MM')
ORDER BY MONTH;

(7)批量停止作业

BEGIN FOR JOB_REC IN (
    SELECT
        NAME
    FROM
        SYSJOB.SYSJOBS
) LOOP SP_ENABLE_JOB (JOB_REC.NAME, 0);

-- 0表示禁用
DBMS_OUTPUT.PUT_LINE ('已禁用作业: ' || JOB_REC.NAME);
END LOOP;
END;
/

(8)清理作业历史信息记录

SP_JOB_CLEAR_HISTORIES('JOB_RECORD_BLOCKING');