概述
在数据库的运维中,备份等工作是需要每天执行的。dm 的作业系统提供了定时执行任务的能力,同时内置了一些常用的定时作业模版。对比常用的 linux cronjob,通过 dm 的作业系统去执行定时任务,有以下优点:
- 用户账号信息更加安全。cronjob 是基于操作系统层面的,想要操作数据库,需要配置数据库登陆信息(一般是记录在隐藏文本文件,通过读取文件的方式实现),一旦将数据库登陆信息记录在系统上,就容易被获取到。
- 操作更加简单。如果涉及到的操作比较复杂,一般需要将指令编写成脚本,由 cronjob 触发脚本内容,而 dm 针对相关数据库操作指定了模版,还可通过图形化界面进行实现,极大降低学习、运维成本。
- dm的作业系统可以实现作业告警。在 dm 里设置操作员,警告,能在作业出现失败的时候第一时间将结果通知到操作员,使相关人员提前介入处理,降低影响。
作业流程
通过dm管理工具进行作业管理,只需要在图形化界面点击相关功能按钮,操作比较简单,本文主要介绍命令行方式。
创建作业代理环境
对于刚部署的环境想要使用作业系统,需要初始化作业环境
SP_INIT_JOB_SYS(1);
语句的主要功能是创建作业系统所会涉及到的模式、表和视图,对应的销毁环境语句如下
SP_INIT_JOB_SYS(0);
以数据库备份功能为例
创建作业
SP_CREATE_JOB (
job_name varchar(128), -- 作业名
enabled int, -- 作业开关
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) -- 作业描述信息
)
作业名作为作业系统管理作业的唯一标识符,不能与DM关键字重合且不能重名
将参数进行划分,方便理解记忆,不考虑告警情况下,主要是指定创建名
[作业名|作业开关,默认为1即可|邮件通知相关,3位字符|网络通知相关,3位字符|描述信息]
开启作业配置
开启作业配置后,会话会处于配置状态,无法操作其他步骤作业
SP_JOB_CONFIG_START (
job_name varchar(128)
)
设置作业执行节点(可选)
DSC集群需要设置此项,其他架构的数据库不需要
SP_JOB_SET_EP_SEQNO (
job_name varchar(128),
ep_seqno int
)
配置作业内容
SP_ADD_JOB_STEP (
job_name varchar(128),
step_name varchar(128), -- 步骤名,步骤之间不重名
type int, -- 步骤类型
command text, -- 步骤指令
succ_action int,
fail_action int,
retry_attempts int, -- 重试机制
retry_interval int, -- 重试间隔
output_file_path varchar(256), -- 废弃,无意义
append_flag int -- 废弃,无意义
)
-
type 内含多种常用数据库模版(下面举例几种常见用法)
0:自定义 sql 语句
2:更新统计信息
4:执行 dts (数据迁移)
6:备份还原 -
command 的含义取决于 type 的取值,本次仅举例备份还原场景下的 command 含义,command由九个部分组成:
[备份模式][备份压缩类型][备份日志类型][备份并行数][USE PWR][备份片大小上限][是否删除备份归档文件][保留字符,默认为0][备份文件路径] -
备份模式取值:
0:全量增备
2:差异增量备份
4:累计增量备份
备份模式为增量时,备份文件路径应为[全量备份路径|增备存放路径]
总体参数比较复杂,基本使用仅需关注备份名,步骤名,type,command即可,重点是command的配置(一般取值为"0/4+7个0+文件路径")
配置作业调度
SP_ADD_JOB_SCHEDULE (
job_name varchar(128), -- 作业名
schedule_name varchar(128), -- 调度名
enable int, -- 开关
type int, -- 调度周期
freq_interval int, -- 调度频率1
freq_sub_interval int, -- 调度频率2
freq_minute_interval int, -- 执行间隔
starttime varchar(128), -- 作业执行时间
endtime varchar(128), -- 作业结束时间
during_start_date varchar(128), -- 作业生效时间
during_end_date varchar(128), -- 作业失效时间
describe varchar(500)
)
此处参数的调度周期+调度频率+执行间隔共同组合设定了执行时间
-
type:指定调度类型(仅例举常用频率,详细参数可参考官网)
0:表示指定作业只执行一次。
1:按天的频率来执行。
2:按周的频率来执行 -
freq_interval:不同调度类型下的发生频率,常用取值为1(每一天,每一周)
当 type=0 时,这个值无效,系统不做检查。
当 type=1 时,表示每几天执行
当 type=2 时,表示的是每几个星期执行 -
freq_sub_interval:在 freq_interval 基础上,继续指定更为精准的频率
当 type=0或1 时,这个值无效,
当 type=2 时,表示的是星期几执行 -
freq_minute_interval: 表示一天内每隔多少分钟执行一次
结束作业配置
SP_JOB_CONFIG_COMMIT (
job_name varchar(128)
)
作业样例
总体而言,通过命令行设定作业所涉及到的参数比较复杂,建议使用图形化工具设置作业或使用作业模版,每次新的作业仅修改部分关键参数。
# 全备
call SP_CREATE_JOB('bakfull',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('bakfull');
call SP_ADD_JOB_STEP('bakfull', 'bakfull', 6, '00000000/dm8/bak/', 0, 0, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('bakfull', 'bakfull_cycle', 1, 2, 1, 64, 0, '23:00:00', NULL, '2024-04-20 00:00:00', NULL, '');
call SP_ADD_JOB_SCHEDULE('bakfull', 'bakfull_once', 1, 0, 0, 0, 0, NULL, NULL, sysdate+1/1440, NULL, '');
call SP_JOB_CONFIG_COMMIT('bakfull');
# 增备
call SP_CREATE_JOB('bakincr',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('bakincr');
call SP_ADD_JOB_STEP('bakincr', 'bakincr', 6, '40000000/dm8/bak/|/dm8/bak/', 0, 0, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('bakincr', 'bakincr_cycle', 1, 2, 1, 63, 0, '23:00:00', NULL, '2024-04-20 00:00:00', NULL, '');
call SP_JOB_CONFIG_COMMIT('bakincr');
# 删除策略
call SP_CREATE_JOB('delbak',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('delbak');
call SP_ADD_JOB_STEP('delbak', 'delbak', 0, 'sf_bakset_backup_dir_add("DISK","/dm8/bak/");call sp_db_bakset_remove_batch("DISK",now()-90);', 0, 0, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('delbak', 'delbak', 1, 1, 1, 0, 0, '23:30:00', NULL, '2024-04-20 00:00:00', NULL, '');
call SP_JOB_CONFIG_COMMIT('delbak');