现象:sqlserver的代理作业,经常会因为os时间的调整(后调、前调)而导致作业不能正常调度执行!
根源:sqlserver作业调度计划的执行必须符合以下原则
- 时间不可以往后调,如 getdate()- n。调整后的时间早于计划调度的“下次运行时间”了,作业不会运行
- 时间不可以往前调一个“主发生频率周期(每天、每周、每月)”,前调若干“次发生频率周期(如主发生频率为每天,次发生频率为分钟 或 小时”则可以。
解决:
- 重建该作业的调度计划
- 禁用作业的调度,再启用该调度
相关信息
msdb.dbo.sysjobschedules 计划调度表
列名 | 数据类型 | 描述 | 说明 |
---|---|---|---|
schedule_id | int | 调度 ID。 | |
job_id | uniqueidentifier | 作业 ID。 | |
name | sysname | 调度的名称。 | |
enabled | int | 调度的启用状态。 | |
freq_type | int | 调度执行的频率: 1 = 一次 | |
freq_interval | int | 表示调度运行日期的值。 如果 freq_type 是 4(每天),则该值是每隔 freq_interval 天。 如果 freq_type 是 8(每周),则该值是表示周调度运行日期的位掩码。freq_interval 值是: 1 = 星期日 如果 freq_type 是 16(每月),则该值是月中的 freq_interval 天。 如果 freq_type 是 32(每月相对信息),则 freq_interval 可以是下列值之一: 1 = 星期日 | |
freq_subday_type | int | freq_subday_interval 的单位: 1 = 以指定的时间 | |
freq_subday_interval | int | 在每个已调度作业执行之间发生的 freq_subday_type 周期数。 | |
freq_relative_ interval | int | 当 freq_type 是 32(每月相对信息)时,每月已调度作业的 freq_interval 发生: 1 = 第一个 2 = 第二个 4 = 第三个 8 = 第四个 16 = 最后一个 | |
freq_recurrence_ factor | int | 在已调度作业执行之间的星期数或月份数。 | |
active_start_date | int | 开始执行作业的日期。 | |
active_end_date | int | 停止执行作业的日期。 | |
active_start_time | int | 开始执行作业的时间。 | |
active_end_time | int | 停止执行作业的时间。 | |
next_run_date | int | 下一次执行作业的日期。 | |
next_run_time | int | 下一次执行作业的时间。 | |
date_created | datetime | 已调度作业项的创建日期。 |