注册
dm作业
技术分享/ 文章详情 /

dm作业

DM_336625 2026/07/02 48 0 0

一、作业系统概述

1.1 什么是作业系统

达梦数据库的作业系统为用户提供了创建作业,并对作业进行调度执行以完成相应管理任务的功能。通过作业系统,可以让这些重复的数据库任务自动完成,实现日常工作自动化。

作业系统的核心价值

  • 自动化:定期备份、数据清理等任务无需人工干预
  • 规范化:确保任务按统一标准执行,避免人工遗漏
  • 可追溯:作业执行历史记录在案,便于审计和排查

1.2 作业系统的三大组成部分

达梦作业系统包含作业(Job)警报(Alert)操作员(Operator) 三部分,三者协同工作构成完整的自动化运维体系。

1.2.1 作业(Job)

作业是由DM代理程序按顺序执行的一系列指定操作。作业可以执行广泛的活动,包括:

  • 运行DM PL/SQL脚本
  • 定期备份数据库
  • 对数据库数据进行检查

每个作业由一个或多个作业步骤(Job Step) 组成,必须至少有一个步骤。

1.2.2 警报(Alert)

警报是系统中发生的某种事件,如发生了特定的数据库操作、出错信号,或者是作业的启动、执行完毕等事件。警报主要用于:

  • 通知指定的操作员
  • 触发执行预定义的作业

可以为警报定义产生的条件,以及警报产生时系统采取的动作。

1.2.3 操作员(Operator)

操作员是负责维护DM服务器运行实例的个人。当警报发生时,可以通过电子邮件或网络发送的方式将警报内容通知到操作员。

1.3 调度(Schedule)

调度是用户定义的一个时间安排,在给定的时刻到来时,系统会启动相关的作业,按作业定义的步骤依次执行。调度可以是:

  • 一次性调度:仅在指定时间执行一次
  • 周期性调度:按固定周期(每天、每周、每月等)重复执行

1.4 作业权限管理

通常作业的管理由DBA来维护,普通用户没有操作作业的权限。为了让普通用户可以创建、配置和调度作业,需要赋予ADMIN JOB权限:

sql

-- 授予普通用户作业管理权限
GRANT ADMIN JOB TO NORMAL_USER;

权限说明

  • DBA用户:默认拥有全部的作业权限,但不可以配置、调度不属于自己的作业
  • ADMIN JOB权限用户:可以添加作业,配置、调度和删除自己的作业,但没有作业环境初始化(SP_INIT_JOB_SYS(1))和作业环境销毁(SP_INIT_JOB_SYS(0))的权限

二、作业系统初始化

在使用作业系统之前,必须先创建代理环境(初始化作业系统)

2.1 通过命令行初始化

sql

-- 初始化作业系统环境(创建SYSJOB模式及相关系统表)
CALL SP_INIT_JOB_SYS(1);

参数说明

  • 1:初始化作业系统环境
  • 0:销毁作业系统环境

重要提示:只有DBA用户有权限执行SP_INIT_JOB_SYS(1)初始化作业环境。

2.2 通过图形化工具初始化

在DM Manager管理工具中,右键点击【代理】,选择【创建代理环境】即可完成初始化。

三、作业管理核心系统表

作业相关的元数据存储在SYSJOB模式下的系统表中:

系统表 存储内容 查询示例
SYSJOBS 作业基本信息 SELECT * FROM SYSJOB.SYSJOBS;
SYSJOBSTEPS 作业步骤信息 SELECT * FROM SYSJOB.SYSJOBSTEPS;
SYSJOBSCHEDULES 作业调度信息 SELECT * FROM SYSJOB.SYSJOBSCHEDULES;
SYSJOBHISTORIES2 作业执行历史 SELECT * FROM SYSJOB.SYSJOBHISTORIES2;
SYSSTEPHISTORIES2 作业步骤执行历史 SELECT * FROM SYSJOB.SYSSTEPHISTORIES2;
SYSOPERATORS 操作员信息 SELECT * FROM SYSJOB.SYSOPERATORS;
SYSALERTS 警报定义信息 SELECT * FROM SYSJOB.SYSALERTS;

关联查询示例

sql

-- 查看作业、作业步骤和作业调度的完整信息
SELECT a.name AS job_name, 
       a.enable, 
       a.username, 
       b.name AS step_name, 
       b.type AS step_type,
       c.name AS schedule_name, 
       c.starttime, 
       c.endtime
FROM sysjob.sysjobs a 
JOIN SYSJOB.SYSJOBSTEPS b ON a.id = b.jobid
JOIN SYSJOB.SYSJOBSCHEDULES c ON a.id = c.jobid
WHERE a.name = 'JOB_NAME';

四、作业的创建与配置

4.1 作业创建黄金流程

创建和配置一个完整的作业,需要按照固定的流程执行:

4.2 核心系统存储过程详解

4.2.1 SP_CREATE_JOB(创建作业)

SP_CREATE_JOB (
    job_name            varchar(128),  -- 作业名称
    enabled             int,            -- 是否启用(1启用/0不启用)
    enable_email        int,            -- 是否开启邮件通知
    email_optr_name     varchar(128),   -- 邮件通知的操作员
    email_type          int,            -- 邮件发送时机
    enabled_netsend     int,            -- 是否开启网络发送
    netsend_optr_name   varchar(128),   -- 网络发送的操作员
    netsend_type        int,            -- 网络发送时机
    describe            varchar(500)    -- 作业描述
);

参数说明

  • enabled:1启用,0不启用
  • email_type/netsend_type:0=成功后发送,1=失败后发送,2=执行结束后发送

4.2.2 SP_JOB_CONFIG_START(开始配置)

sql

SP_JOB_CONFIG_START (job_name varchar(128));

说明:开始作业配置之后到结束作业配置之前,当前会话会处于作业配置状态,不允许添加、删除、修改其他作业的步骤或调度。

4.2.3 SP_ADD_JOB_STEP(添加作业步骤)

sql

SP_ADD_JOB_STEP (
    job_name         varchar(128),  -- 作业名称
    step_name        varchar(128),  -- 步骤名称
    step_type        int,            -- 步骤类型
    command_text     varchar(8187),  -- 执行命令
    retry_num        int,            -- 失败重试次数
    retry_interval   int,            -- 重试间隔(秒)
    timeout          int,            -- 超时时间(秒)
    start_step       int,            -- 起始步骤标识
    db_name          varchar(128),   -- 数据库名
    step_no          int             -- 步骤序号(0表示自动)
);

步骤类型(step_type)说明

  • 0:执行SQL语句
  • 6:执行备份(达梦内置备份类型)

4.2.4 SP_ADD_JOB_SCHEDULE(添加调度)

SP_ADD_JOB_SCHEDULE (
    job_name         varchar(128),   -- 作业名称
    schedule_name    varchar(128),   -- 调度名称
    schedule_type    int,             -- 调度类型
    enable           int,             -- 是否启用
    type             int,             -- 周期类型
    interval_type    int,             -- 间隔类型
    sub_interval     int,             -- 子间隔
    start_time       time,            -- 开始时间
    end_time         time,            -- 结束时间
    start_date       datetime,        -- 开始日期
    end_date         datetime,        -- 结束日期
    condition        varchar(400)     -- 条件表达式
);

参数说明

  • schedule_type:1表示循环调度,2表示一次性调度
  • type:1=日周期,2=周周期,3=月周期
  • condition:用于设置更复杂的调度条件,如TO_CHAR(SYSDATE,'D')='1'表示仅周日执行

4.2.5 SP_JOB_CONFIG_COMMIT(提交配置)

SP_JOB_CONFIG_COMMIT (job_name varchar(128));

说明:只有在结束作业配置后,这个作业才算配置完成。如果作业是ENABLE状态的,它会立即生效,从"结束作业配置"时刻开始就会根据它所定义的调度来执行操作。

4.2.6 SP_ENABLE_JOB(启用/暂停作业)

SP_ENABLE_JOB (job_name varchar(128), enabled int);

示例SP_ENABLE_JOB('JOB_TEST', 0); – 暂停作业

4.3 创建作业完整示例

以下是一个完整的作业创建示例(每日全量备份):

-- 1. 初始化作业环境(首次使用执行一次) CALL SP_INIT_JOB_SYS(1); -- 2. 创建空作业 CALL SP_CREATE_JOB('JOB_DAILY_BACKUP', 1, 0, '', 0, 0, '', 0, '每日全量备份'); -- 3. 开启作业配置 CALL SP_JOB_CONFIG_START('JOB_DAILY_BACKUP'); -- 4. 添加备份步骤(类型6=备份操作) CALL SP_ADD_JOB_STEP('JOB_DAILY_BACKUP', 'STEP_BACKUP', 6, '00000000/dm8/backup', 0, 0, 0, 0, NULL, 0); -- 5. 添加调度(每日凌晨2:00执行) CALL SP_ADD_JOB_SCHEDULE('JOB_DAILY_BACKUP', 'SCHEDULE_2AM', 1, 1, 1, 0, 0, '02:00:00', NULL, SYSDATE, NULL, ''); -- 6. 提交配置 CALL SP_JOB_CONFIG_COMMIT('JOB_DAILY_BACKUP'); -- 7. 启动作业 CALL SP_JOB_CONFIG_START('JOB_DAILY_BACKUP');

五、生产环境常用作业模板

以下5个作业模板是生产环境中最常用的,复制后修改参数即可直接使用。

模板1:每日清理历史数据

清理业务日志表中3个月前的历史数据,释放存储空间。

-- 1. 创建空作业 CALL SP_CREATE_JOB('JOB_CLEAN_LOG', 1, 0, '', 0, 0, '', 0, '清理3个月前操作日志'); -- 2. 开启作业配置模式 CALL SP_JOB_CONFIG_START('JOB_CLEAN_LOG'); -- 3. 添加清理步骤(0=执行SQL语句) CALL SP_ADD_JOB_STEP('JOB_CLEAN_LOG', 'STEP_CLEAN', 0, 'DELETE FROM DMHR.USER_OPER_LOG WHERE OPER_TIME < ADD_MONTHS(SYSDATE, -3); COMMIT;', 0, 0, 0, 0, NULL, 0); -- 4. 添加调度(每日凌晨2点执行) CALL SP_ADD_JOB_SCHEDULE('JOB_CLEAN_LOG', 'SCHEDULE_DAILY', 1, 1, 1, 0, 0, '02:00:00', NULL, SYSDATE, NULL, ''); -- 5. 提交配置并启动 CALL SP_JOB_CONFIG_COMMIT('JOB_CLEAN_LOG'); CALL SP_JOB_CONFIG_START('JOB_CLEAN_LOG');

模板2:每周全量备份+每日增量备份

2.1 每周日凌晨3点全量备份

-- 创建作业 CALL SP_CREATE_JOB('JOB_FULL_BACKUP', 1, 0, '', 0, 0, '', 0, '每周日全量备份'); -- 开启配置 CALL SP_JOB_CONFIG_START('JOB_FULL_BACKUP'); -- 添加备份步骤 CALL SP_ADD_JOB_STEP('JOB_FULL_BACKUP', 'STEP_FULL', 0, 'CALL SP_DATABASE_BACKUP(''BACKUP_PATH=/dm/backup'', ''BACKUP_TYPE=FULL'', ''COMPRESS=1'');', 0, 0, 0, 0, NULL, 0); -- 调度:每周日3点(condition限定周日) CALL SP_ADD_JOB_SCHEDULE('JOB_FULL_BACKUP', 'SCHEDULE_WEEKLY', 1, 1, 1, 0, 0, '03:00:00', NULL, SYSDATE, NULL, 'TO_CHAR(SYSDATE,''D'')=''1'''); -- 提交并启动 CALL SP_JOB_CONFIG_COMMIT('JOB_FULL_BACKUP'); CALL SP_JOB_CONFIG_START('JOB_FULL_BACKUP');

2.2 每日增量备份(除周日外)

CALL SP_CREATE_JOB('JOB_INCR_BACKUP', 1, 0, '', 0, 0, '', 0, '每日增量备份'); CALL SP_JOB_CONFIG_START('JOB_INCR_BACKUP'); CALL SP_ADD_JOB_STEP('JOB_INCR_BACKUP', 'STEP_INCR', 0, 'CALL SP_DATABASE_BACKUP(''BACKUP_PATH=/dm/backup'', ''BACKUP_TYPE=INCR'', ''COMPRESS=1'');', 0, 0, 0, 0, NULL, 0); -- 每日2点,周日不执行 CALL SP_ADD_JOB_SCHEDULE('JOB_INCR_BACKUP', 'SCHEDULE_DAILY', 1, 1, 1, 0, 0, '02:00:00', NULL, SYSDATE, NULL, 'TO_CHAR(SYSDATE,''D'')<>''1'''); CALL SP_JOB_CONFIG_COMMIT('JOB_INCR_BACKUP'); CALL SP_JOB_CONFIG_START('JOB_INCR_BACKUP');

模板3:每日收集统计信息

定期收集统计信息,确保查询优化器能够生成正确的执行计划。

CALL SP_CREATE_JOB('JOB_ANALYZE_STATS', 1, 0, '', 0, 0, '', 0, '收集表统计信息'); CALL SP_JOB_CONFIG_START('JOB_ANALYZE_STATS'); CALL SP_ADD_JOB_STEP('JOB_ANALYZE_STATS', 'STEP_ANALYZE', 0, 'BEGIN CALL SP_ANALYZE_TABLE_ALL(''USER_TABLES''); END;', 0, 0, 0, 0, NULL, 0); -- 每日凌晨1点执行 CALL SP_ADD_JOB_SCHEDULE('JOB_ANALYZE_STATS', 'SCHEDULE_DAILY', 1, 1, 1, 0, 0, '01:00:00', NULL, SYSDATE, NULL, ''); CALL SP_JOB_CONFIG_COMMIT('JOB_ANALYZE_STATS'); CALL SP_JOB_CONFIG_START('JOB_ANALYZE_STATS');

模板4:清理过期归档日志

归档日志会持续占用磁盘空间,需定期清理。

CALL SP_CREATE_JOB('JOB_CLEAN_ARCHIVE', 1, 0, '', 0, 0, '', 0, '清理7天前归档日志'); CALL SP_JOB_CONFIG_START('JOB_CLEAN_ARCHIVE'); CALL SP_ADD_JOB_STEP('JOB_CLEAN_ARCHIVE', 'STEP_CLEAN', 0, 'BEGIN SF_BAKSET_BACKUP_DIR_ADD(''DISK'', ''/dm/archive''); SF_ARCHIVELOG_DELETE_BEFORE_TIME(SYSDATE-7); END;', 0, 0, 0, 0, NULL, 0); -- 每日凌晨3点执行 CALL SP_ADD_JOB_SCHEDULE('JOB_CLEAN_ARCHIVE', 'SCHEDULE_DAILY', 1, 1, 1, 0, 0, '03:00:00', NULL, SYSDATE, NULL, ''); CALL SP_JOB_CONFIG_COMMIT('JOB_CLEAN_ARCHIVE'); CALL SP_JOB_CONFIG_START('JOB_CLEAN_ARCHIVE');

模板5:删除8天前的备份文件

CALL SP_CREATE_JOB('JOB_REMOVE_BACKUP', 1, 0, '', 0, 0, '', 0, '删除8天前备份'); CALL SP_JOB_CONFIG_START('JOB_REMOVE_BACKUP'); CALL SP_ADD_JOB_STEP('JOB_REMOVE_BACKUP', 'STEP_REMOVE', 0, 'BEGIN SF_BAKSET_BACKUP_DIR_ADD(''DISK'', ''/dm/backup''); SP_DB_BAKSET_REMOVE_BATCH(''DISK'', NOW()-8); END;', 0, 0, 0, 0, NULL, 0); CALL SP_ADD_JOB_SCHEDULE('JOB_REMOVE_BACKUP', 'SCHEDULE_DAILY', 1, 1, 1, 0, 0, '22:00:00', NULL, SYSDATE, NULL, ''); CALL SP_JOB_CONFIG_COMMIT('JOB_REMOVE_BACKUP'); CALL SP_JOB_CONFIG_START('JOB_REMOVE_BACKUP');

六、作业的监控与维护

6.1 查看作业执行历史

-- 查看最近作业执行情况 SELECT JOB_NAME, START_TIME, END_TIME, STATUS, ERROR_CODE FROM SYSJOB.SYSJOBHISTORIES2 ORDER BY START_TIME DESC LIMIT 20;

6.2 修改作业

-- 修改作业属性 SP_ALTER_JOB('JOB_NAME', 1, 0, '', 0, 0, '', 0, '新的描述'); -- 重命名作业 SP_RENAME_JOB('OLD_NAME', 'NEW_NAME'); -- 暂停作业 SP_ENABLE_JOB('JOB_NAME', 0); -- 恢复作业 SP_ENABLE_JOB('JOB_NAME', 1);

6.3 删除作业

-- 删除作业(会同时删除关联的步骤和调度) SP_DROP_JOB('JOB_NAME');

6.4 集群环境作业节点配置

在DSC集群环境中,可以指定作业在哪个节点上执行:

SP_JOB_SET_EP_SEQNO('JOB_NAME', 2); -- 指定在节点2上执行

高可用说明:若作业指定的节点为非控制节点且该节点故障,作业会在控制节点上执行。

七、常见问题与注意事项

问题 解决方法
作业不执行 检查作业是否启用(SP_ENABLE_JOB),调度时间配置是否正确
权限不足 确认用户是否有ADMIN JOB权限,作业环境是否已初始化
作业未初始化错误 先执行CALL SP_INIT_JOB_SYS(1);初始化作业系统
作业配置未生效 确认是否执行了SP_JOB_CONFIG_COMMIT提交配置
作业重复执行 检查是否有多个调度指向同一作业
备份作业失败 确认备份路径是否存在、磁盘空间是否充足

达梦社区技术 https://eco.dameng.com

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服