达梦数据库的作业系统为用户提供了创建作业,并对作业进行调度执行以完成相应管理任务的功能。通过作业系统,可以让这些重复的数据库任务自动完成,实现日常工作自动化。
作业系统的核心价值:
达梦作业系统包含作业(Job) 、警报(Alert) 和操作员(Operator) 三部分,三者协同工作构成完整的自动化运维体系。
作业是由DM代理程序按顺序执行的一系列指定操作。作业可以执行广泛的活动,包括:
每个作业由一个或多个作业步骤(Job Step) 组成,必须至少有一个步骤。
警报是系统中发生的某种事件,如发生了特定的数据库操作、出错信号,或者是作业的启动、执行完毕等事件。警报主要用于:
可以为警报定义产生的条件,以及警报产生时系统采取的动作。
操作员是负责维护DM服务器运行实例的个人。当警报发生时,可以通过电子邮件或网络发送的方式将警报内容通知到操作员。
调度是用户定义的一个时间安排,在给定的时刻到来时,系统会启动相关的作业,按作业定义的步骤依次执行。调度可以是:
通常作业的管理由DBA来维护,普通用户没有操作作业的权限。为了让普通用户可以创建、配置和调度作业,需要赋予ADMIN JOB权限:
sql
-- 授予普通用户作业管理权限
GRANT ADMIN JOB TO NORMAL_USER;
权限说明:
SP_INIT_JOB_SYS(1))和作业环境销毁(SP_INIT_JOB_SYS(0))的权限在使用作业系统之前,必须先创建代理环境(初始化作业系统) 。
sql
-- 初始化作业系统环境(创建SYSJOB模式及相关系统表)
CALL SP_INIT_JOB_SYS(1);
参数说明:
1:初始化作业系统环境0:销毁作业系统环境重要提示:只有DBA用户有权限执行SP_INIT_JOB_SYS(1)初始化作业环境。
在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';
创建和配置一个完整的作业,需要按照固定的流程执行:
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=执行结束后发送sql
SP_JOB_CONFIG_START (job_name varchar(128));
说明:开始作业配置之后到结束作业配置之前,当前会话会处于作业配置状态,不允许添加、删除、修改其他作业的步骤或调度。
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:执行备份(达梦内置备份类型)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'表示仅周日执行SP_JOB_CONFIG_COMMIT (job_name varchar(128));
说明:只有在结束作业配置后,这个作业才算配置完成。如果作业是ENABLE状态的,它会立即生效,从"结束作业配置"时刻开始就会根据它所定义的调度来执行操作。
SP_ENABLE_JOB (job_name varchar(128), enabled int);
示例:SP_ENABLE_JOB('JOB_TEST', 0); – 暂停作业
以下是一个完整的作业创建示例(每日全量备份):
-- 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个作业模板是生产环境中最常用的,复制后修改参数即可直接使用。
清理业务日志表中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');
-- 创建作业
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');
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');
定期收集统计信息,确保查询优化器能够生成正确的执行计划。
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');
归档日志会持续占用磁盘空间,需定期清理。
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');
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');
-- 查看最近作业执行情况
SELECT JOB_NAME, START_TIME, END_TIME, STATUS, ERROR_CODE
FROM SYSJOB.SYSJOBHISTORIES2
ORDER BY START_TIME DESC
LIMIT 20;
-- 修改作业属性
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);
-- 删除作业(会同时删除关联的步骤和调度)
SP_DROP_JOB('JOB_NAME');
在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
文章
阅读量
获赞
