注册
达梦数据库定时作业的使用
技术分享/ 文章详情 /

达梦数据库定时作业的使用

何处惹尘埃 2026/08/07 132 0 0

问题6:数据库定时作业的使用。怎么查看数据库调度作业的历史执行情况?如果历史信息看不到,如何查看调度作业是否执行成功?

一、概念说明

达梦数据库的定时作业(Job)用于自动执行预定义的任务,如定期备份、数据清理、统计信息收集等。作业由作业系统管理,需要先初始化作业环境。作业创建后,系统按设定的时间间隔自动执行指定的 SQL 语句或存储过程。

二、实操环境

  • 实例:TESTDB(端口 5239)
  • 测试用户:SYSDBA
  • 测试表:TEST.JOB_LOG(记录作业执行日志)

三、初始化作业环境

执行命令

SELECT COUNT(*) FROM SYS.JOBS;

报错输出

[-2106]:无效的表或视图名[JOBS]

原因:作业系统尚未初始化,SYS.JOBS 表不存在。

解决方法

CALL SP_INIT_JOB_SYS(1);

输出

DMSQL 过程已成功完成

SP_INIT_JOB_SYS(1) 用于创建作业系统所需的系统表和视图,参数 1 表示创建作业环境。

四、创建日志表

执行命令

CREATE TABLE TEST.JOB_LOG ( LOG_ID INT IDENTITY(1,1), LOG_TIME DATETIME, LOG_MSG VARCHAR(100) );

输出

操作已执行

各列含义:

  • LOG_ID:自增主键,用于标识每条日志记录
  • LOG_TIME:记录插入时间,用于验证作业执行时间
  • LOG_MSG:日志消息内容

五、创建定时作业

5.1 使用 DBMS_JOB.SUBMIT 创建作业

DECLARE jobno INT; BEGIN DBMS_JOB.SUBMIT( jobno, 'INSERT INTO TEST.JOB_LOG(LOG_TIME, LOG_MSG) VALUES(SYSDATE, ''Job executed'');', SYSDATE, 'SYSDATE + 1/1440' ); COMMIT; END; /

输出

DMSQL 过程已成功完成

参数说明(按位置顺序):

参数位置 说明 当前值
第1个参数 作业编号(返回) jobno
第2个参数 要执行的 SQL 语句 'INSERT INTO TEST.JOB_LOG...'
第3个参数 首次执行时间 SYSDATE(当前时间)
第4个参数 执行间隔表达式 'SYSDATE + 1/1440'(每分钟一次)

间隔表达式说明

  • SYSDATE + 1/1440:每分钟执行一次
  • SYSDATE + 5/1440:每 5 分钟执行一次
  • SYSDATE + 1/24:每小时执行一次
  • SYSDATE + 1:每天执行一次
  • TRUNC(SYSDATE) + 1 + 2/24:每天凌晨 2 点执行

六、查看作业信息

6.1 使用 USER_JOBS 查看作业

SELECT * FROM USER_JOBS;

输出

行号  JOB         LOG_USER  PRIV_USER  SCHEMA_USER  LAST_DATE  LAST_SEC
----- ----------- --------- ---------- ------------ ---------- --------
      THIS_DATE  THIS_SEC  NEXT_DATE   NEXT_SEC     TOTAL_TIME
      ---------  --------  ----------  ----------   ----------
      BROKEN     INTERVAL             FAILURES
      ------     -------------------- --------
      WHAT
      -------------------------------------------------------------------
      NLS_ENV  MISC_ENV  INSTANCE
      -------  --------  --------
1     1785719086 SYSDBA   SYSDBA     SYSDBA       NULL       NULL
      NULL     NULL      2026-08-03  09:04:45     NULL
      N        SYSDATE + 1/1440       0
      INSERT INTO TEST.JOB_LOG(LOG_TIME, LOG_MSG) VALUES(SYSDATE, 'Job executed');
      NULL     NULL      1

各列含义

列名 说明
JOB 1785719086 作业编号(由系统自动分配)
LOG_USER / PRIV_USER / SCHEMA_USER SYSDBA 作业所属用户
NEXT_DATE 2026-08-03 09:04:45 下次执行时间
INTERVAL SYSDATE + 1/1440 执行间隔(每分钟一次)
BROKEN N 是否损坏(N=正常,Y=已暂停)
FAILURES 0 失败次数(0 表示未失败过)
WHAT INSERT INTO TEST.JOB_LOG… 作业执行的 SQL 语句

6.2 查看作业执行状态

SELECT JOB, LAST_DATE, NEXT_DATE, FAILURES FROM USER_JOBS;

输出

行号  JOB         LAST_DATE  NEXT_DATE  FAILURES
----- ----------- ---------- ---------- --------
1     1785719086  2026-08-03 2026-08-03 0

各列含义:

  • LAST_DATE:作业上次执行时间
  • NEXT_DATE:作业下次执行时间
  • FAILURES:失败次数(0 表示未失败过)

6.3 查看作业执行历史

SELECT * FROM DBA_JOB_RUN_DETAILS;

报错

[-2106]:无效的表或视图名[DBA_JOB_RUN_DETAILS]

原因:当前达梦版本不支持 DBA_JOB_RUN_DETAILS 视图。可通过以下方式验证作业执行:

  • 查询 USER_JOBSLAST_DATE 列查看上次执行时间
  • 查询业务日志表(如 TEST.JOB_LOG)验证作业是否执行

替代验证方法

-- 查看作业上次执行时间 SELECT JOB, LAST_DATE, NEXT_DATE, FAILURES FROM USER_JOBS; -- 查询业务日志表验证 SELECT * FROM TEST.JOB_LOG ORDER BY LOG_TIME DESC;

七、验证作业执行

7.1 等待 1-2 分钟后查询日志表

SELECT * FROM TEST.JOB_LOG ORDER BY LOG_TIME DESC;

输出

行号  LOG_ID  LOG_TIME                   LOG_MSG
----- ------ -------------------------- ------------
1     3       2026-08-03 09:07:49.000000 Job executed
2     2       2026-08-03 09:06:49.000000 Job executed
3     1       2026-08-03 09:05:49.000000 Job executed

结论

  • 作业已在 09:05:4909:06:4909:07:49 三个时间点成功执行三次
  • LOG_ID 自增列验证了每次执行都插入了新记录
  • 三次执行的间隔均为 1分钟,与 INTERVAL=SYSDATE+1/1440 一致

7.2 确认作业执行状态

SELECT JOB, LAST_DATE, NEXT_DATE, FAILURES FROM USER_JOBS;

输出(作业删除前):

行号  JOB         LAST_DATE  NEXT_DATE  FAILURES
----- ----------- ---------- ---------- --------
1     1785719086  2026-08-03 2026-08-03 0

LAST_DATE 显示 2026-08-03FAILURES=0,证明作业已成功执行且未出错。

八、作业管理操作

8.1 修改作业执行间隔

-- 改为每 5 分钟执行一次 CALL DBMS_JOB.CHANGE(1785719086, NULL, NULL, 'SYSDATE + 5/1440');

输出

DMSQL 过程已成功完成

参数说明(按位置顺序):

  • 第1个参数:作业编号
  • 第2个参数:要执行的 SQL(NULL 表示不变)
  • 第3个参数:下次执行时间(NULL 表示不变)
  • 第4个参数:执行间隔('SYSDATE + 5/1440' 表示每 5 分钟一次)

8.2 暂停作业

CALL DBMS_JOB.BROKEN(1785719086, TRUE);

输出

DMSQL 过程已成功完成

BROKEN 标记为 TRUE,作业暂停执行。

8.3 恢复作业

CALL DBMS_JOB.BROKEN(1785719086, FALSE);

输出

DMSQL 过程已成功完成

BROKEN 标记为 FALSE,作业恢复执行。

8.4 删除作业

CALL DBMS_JOB.REMOVE(1785719086);

输出

DMSQL 过程已成功完成

删除作业后,作业不再执行。验证删除结果:

SELECT JOB, LAST_DATE, NEXT_DATE, FAILURES FROM USER_JOBS;

输出

未选定行

九、常见问题处理

问题 原因 解决方法
[-2106]:无效的表或视图名[JOBS] 作业系统未初始化 执行 CALL SP_INIT_JOB_SYS(1);
[-2007]:语法分析出错 使用了错误的参数语法(如命名参数 job => jobno 使用位置参数传递
作业未执行 作业被暂停(BROKEN=Y)或间隔设置错误 检查 BROKEN 状态,确认 INTERVAL 表达式正确
作业执行失败 SQL 语句有语法错误或权限不足 检查 WHAT 中的 SQL 语句,确认用户有执行权限
DBA_JOB_RUN_DETAILS 不存在 当前版本不支持该视图 通过 USER_JOBSLAST_DATE 列和业务日志表验证

十、问题回答

问题:怎么查看数据库调度作业的历史执行情况?

在当前达梦版本中,DBA_JOB_RUN_DETAILS 视图不可用。可通过以下方式查看:

  1. 查询 USER_JOBS 视图:查看 LAST_DATE 列获取上次执行时间
  2. 创建业务日志表:在作业的 WHAT 中插入日志记录到自定义表
-- 方式一:查看执行状态 SELECT JOB, LAST_DATE, NEXT_DATE, FAILURES FROM USER_JOBS; -- 方式二:查询业务日志表 SELECT * FROM TEST.JOB_LOG ORDER BY LOG_TIME DESC;

问题:如果历史信息看不到,如何查看调度作业是否执行成功?

  1. 检查 FAILURESUSER_JOBS 中的 FAILURES 列记录失败次数,0 表示未失败过
  2. 检查 LAST_DATE:确认作业上次执行时间是否更新
  3. 查询业务日志表:确认是否有新数据插入
-- 综合判断作业是否执行成功 SELECT JOB, LAST_DATE, FAILURES FROM USER_JOBS WHERE JOB = 1785719086;

十一、完整操作命令清单

-- 1. 初始化作业环境 CALL SP_INIT_JOB_SYS(1); -- 2. 创建日志表 CREATE TABLE TEST.JOB_LOG (LOG_ID INT IDENTITY(1,1), LOG_TIME DATETIME, LOG_MSG VARCHAR(100)); -- 3. 创建作业 DECLARE jobno INT; BEGIN DBMS_JOB.SUBMIT(jobno, 'INSERT INTO TEST.JOB_LOG(LOG_TIME, LOG_MSG) VALUES(SYSDATE, ''Job executed'');', SYSDATE, 'SYSDATE + 1/1440'); COMMIT; END; / -- 4. 查看所有作业 SELECT * FROM USER_JOBS; -- 5. 查看作业执行状态 SELECT JOB, LAST_DATE, NEXT_DATE, FAILURES FROM USER_JOBS; -- 6. 验证作业执行(查询日志表) SELECT * FROM TEST.JOB_LOG ORDER BY LOG_TIME DESC; -- 7. 修改作业执行间隔(每5分钟) CALL DBMS_JOB.CHANGE(1785719086, NULL, NULL, 'SYSDATE + 5/1440'); -- 8. 暂停作业 CALL DBMS_JOB.BROKEN(1785719086, TRUE); -- 9. 恢复作业 CALL DBMS_JOB.BROKEN(1785719086, FALSE); -- 10. 删除作业 CALL DBMS_JOB.REMOVE(1785719086); -- 11. 验证删除结果 SELECT JOB, LAST_DATE, NEXT_DATE, FAILURES FROM USER_JOBS;

十二、总结

通过本次实操,我们完成了:

  1. 初始化作业环境SP_INIT_JOB_SYS(1) 创建作业系统所需的系统表和视图
  2. 创建定时作业:使用 DBMS_JOB.SUBMIT 创建每分钟执行的作业
  3. 查看作业信息:通过 USER_JOBS 查看作业配置和执行状态
  4. 验证作业执行:通过业务日志表和 USER_JOBSLAST_DATE 列验证作业已执行(三次执行记录 09:05:4909:06:4909:07:49
  5. 管理作业:修改间隔、暂停、恢复、删除作业
  6. 问题回答:完成“查看作业历史执行情况”和“历史信息看不到时如何判断执行成功”的实操验证

核心要点

  • 作业创建前必须先初始化作业环境(SP_INIT_JOB_SYS(1)
  • DBMS_JOB.SUBMIT 使用位置参数,不支持命名参数
  • USER_JOBS 是查看作业信息的主要视图,其中 BROKEN 列表示作业是否暂停,FAILURES 列记录失败次数
  • 作业执行验证可通过业务日志表或 USER_JOBSLAST_DATE 列确认
  • DBA_JOB_RUN_DETAILS 在当前版本中不可用,需使用替代方法验证
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服