问题6:数据库定时作业的使用。怎么查看数据库调度作业的历史执行情况?如果历史信息看不到,如何查看调度作业是否执行成功?
达梦数据库的定时作业(Job)用于自动执行预定义的任务,如定期备份、数据清理、统计信息收集等。作业由作业系统管理,需要先初始化作业环境。作业创建后,系统按设定的时间间隔自动执行指定的 SQL 语句或存储过程。
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:日志消息内容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 点执行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 语句 |
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 表示未失败过)SELECT * FROM DBA_JOB_RUN_DETAILS;
报错:
[-2106]:无效的表或视图名[DBA_JOB_RUN_DETAILS]
原因:当前达梦版本不支持 DBA_JOB_RUN_DETAILS 视图。可通过以下方式验证作业执行:
USER_JOBS 的 LAST_DATE 列查看上次执行时间TEST.JOB_LOG)验证作业是否执行替代验证方法:
-- 查看作业上次执行时间
SELECT JOB, LAST_DATE, NEXT_DATE, FAILURES FROM USER_JOBS;
-- 查询业务日志表验证
SELECT * FROM TEST.JOB_LOG ORDER BY LOG_TIME DESC;
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:49、09:06:49、09:07:49 三个时间点成功执行三次LOG_ID 自增列验证了每次执行都插入了新记录1分钟,与 INTERVAL=SYSDATE+1/1440 一致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-03,FAILURES=0,证明作业已成功执行且未出错。
-- 改为每 5 分钟执行一次
CALL DBMS_JOB.CHANGE(1785719086, NULL, NULL, 'SYSDATE + 5/1440');
输出:
DMSQL 过程已成功完成
参数说明(按位置顺序):
'SYSDATE + 5/1440' 表示每 5 分钟一次)CALL DBMS_JOB.BROKEN(1785719086, TRUE);
输出:
DMSQL 过程已成功完成
将 BROKEN 标记为 TRUE,作业暂停执行。
CALL DBMS_JOB.BROKEN(1785719086, FALSE);
输出:
DMSQL 过程已成功完成
将 BROKEN 标记为 FALSE,作业恢复执行。
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_JOBS 的 LAST_DATE 列和业务日志表验证 |
问题:怎么查看数据库调度作业的历史执行情况?
在当前达梦版本中,DBA_JOB_RUN_DETAILS 视图不可用。可通过以下方式查看:
USER_JOBS 视图:查看 LAST_DATE 列获取上次执行时间WHAT 中插入日志记录到自定义表-- 方式一:查看执行状态
SELECT JOB, LAST_DATE, NEXT_DATE, FAILURES FROM USER_JOBS;
-- 方式二:查询业务日志表
SELECT * FROM TEST.JOB_LOG ORDER BY LOG_TIME DESC;
问题:如果历史信息看不到,如何查看调度作业是否执行成功?
FAILURES 列:USER_JOBS 中的 FAILURES 列记录失败次数,0 表示未失败过LAST_DATE 列:确认作业上次执行时间是否更新-- 综合判断作业是否执行成功
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;
通过本次实操,我们完成了:
SP_INIT_JOB_SYS(1) 创建作业系统所需的系统表和视图DBMS_JOB.SUBMIT 创建每分钟执行的作业USER_JOBS 查看作业配置和执行状态USER_JOBS 的 LAST_DATE 列验证作业已执行(三次执行记录 09:05:49、09:06:49、09:07:49)核心要点:
SP_INIT_JOB_SYS(1))DBMS_JOB.SUBMIT 使用位置参数,不支持命名参数USER_JOBS 是查看作业信息的主要视图,其中 BROKEN 列表示作业是否暂停,FAILURES 列记录失败次数USER_JOBS 的 LAST_DATE 列确认DBA_JOB_RUN_DETAILS 在当前版本中不可用,需使用替代方法验证文章
阅读量
获赞
