SQL SERVER作业的Schedules浅析

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

   SQL SERVER作业的计划(Schedules),如果你没仔细研究过或没有应用一些复杂的计划(Schedules),那么你觉得SQL SERVER作业的计划(Schedules)非常好用,也没啥问题,但是我要告诉你一个“残酷”的真相,相比Linux系统的Crontab,SQL SERVER作业的计划其实是一个二等残废,很多功能要实行起来真的是让人头疼!

如果你自认为非常了解作业的配置(不要想当然,实践验证保证会让你大吃一惊)?那么接下来先看看几个问题:

1:如果你要配置作业在每个小时的第20分钟执行,例如1:20、2:20、3:20........执行,你怎么配置?

2:在计划(Schedules)里面,如果执行间隔为“小时”,那么取值必须为整数吗? 可以为2.5个小时吗?

3:在计划(Schedules)里面,如果我要设置执行间隔为90分钟计划,这样能行吗?

4:如果我想在计划(Schedules)外,多执行一次作业,如何执行? 执行了后,是否影响作业的计划Schedules?

5: 修改系统时间,是否会影响作业的Schedule?

 

1:如果你要配置作业在每个小时的第20分钟执行,例如1:20、2:20、3:20........执行,你怎么配置?

对于问题1这种类似的问题,如果你遇到过而且解 决过这类问题,那么其实很简单,你只需要设置开始时间为0:20即可,否则无法实现。至于SQL SERVER为什么要这么蛋疼的设置,应该是执行间隔有一个参照时间点(第一次执行的时间点),你设置开始开始时间为0:20,即表示这个时间点作为第一 次执行的参照点。

 

clip_image002

 

2:在计划(Schedules)里面,如果执行间隔为“小时”,那么取值必须为整数吗? 可以为2.5个小时吗?

关于问题2,答案是执行间隔是不能设成小数的, 只能为整数,只能为1,2,3。。。。如果你将其值设置为一个小数,则当你点击确定按钮后,它会自动四舍五入变成一个整数,例如,你输入1.3 ,你点击确定后,再打开,你会发现其值变为1了,如果是1.6,则会变成2,不信的话,你可以试试。对于秒、分钟都是如此。为什么如此呢,答案在于系统表 msdb.dbo.sysschedules,不明白可以看文章最后。

 

3:在计划(Schedules)里面,如果我要设置执行间隔为90分钟计划,这样能行吗?

如果没有实践过的人,肯定会信誓旦旦的说,那肯定可以啊。答案是设置执行间隔不能超过61,否则当你点击确认的时候,系统自动会将其设为60,至于原因,我暂时没有想明白,微软这个限定,感觉真蛋疼。如果真有需求需要90分钟执行一次,那怎么办? 纠结了把。

方法1: 将作业J拆分成两个一模一样的作业J1 和J2,然后设置其Schedules为3小时执行一次,两个作业错开执行,刚好能满足业务需求。不过想想都觉得麻烦!

 

方法2: 作业Schedule执行时间间隔90分钟的实现方式是通过下面方式实现的:其实是将Schedule时间设为30分钟执行一次,然后再代码里面按其规律,达到90分钟才真正执行业务逻辑SQL代码。

2.1 从0:00(服务器时间)开始,作业Schedule的频率为30分钟一次,实际上只需要执行下面时间点(实际执行时间90分钟),按规律可以分成两种:

            整点执行的(0:00, 1:00, 2:00, 3:00…..) 只有当Hour %3 = 0 时才执行存储过程。

            非整点执行的(0:30, 1:30, 2:30 ……......) 只有当Hour % 3= 1时才执行存储过程。

2.2 从0:30(服务器时间)开始,作业Schedule的频率为30分钟一次,实际上只需要执行下面时间点,按规律也可以分成两种。

            整点执行的(0:00, 1:00, 2:00, 3:00…..) 只有当Hour %3 = 2 时才执行存储过程。

            非整点执行的(0:30, 1:30, 2:30 …….......) 只有当Hour % 3= 0时才执行存储过程。

 




clip_image004



DECLARE @Hours   INT;

DECLARE @Minute    INT;

SELECT @Hours =CAST(SUBSTRING(CONVERT(VARCHAR(16), GETDATE(), 120),11,3) AS INT);

SELECT @Minute=CAST(SUBSTRING(CONVERT(VARCHAR(16), GETDATE(), 120),15,2) AS INT);

IF @Minute = 30 AND @Hours%3 = 0

BEGIN 

       INSERT INTO BI_JOB_LOG   --暂时记录执行时间

       SELECT GETDATE();

        --执行业务逻辑代码

        ...........................

END;

IF @Minute = 0 AND  @Hours%3=2

BEGIN

       INSERT INTO BI_JOB_LOG

       SELECT GETDATE();

        --执行业务逻辑代码

        ...........................

END;

4:如果我想在计划(Schedules)外,多执行一次作业,如何执行? 执行了后,是否影响作业的计划Schedules?

如下图所示,我建立一个测试作业test,每隔13分钟执行一次,在21:57, 21:58我分别手动执行了该作业两次,但是丝毫不影响该作业的调度计划。在22:06分钟还是准时执行了。

clip_image006

要查看作业下次执行时间,可以通过SELECT * FROM msdb.dbo.sysjobschedules 来查看。

 

5: 修改系统时间,是否会影响作业的Schedule?

  答案是会影响,一般要么重建该作业的调度计划或禁用作业的调度,再启用该调度来解决。有兴趣的可以自己试验一下,这里不做过多介绍。

SQL SERVER数据库作业的 Schedule 信息一般位于表 msdb.dbo.sysschedules,如下所示

包含有关 SQL Server 代理作业计划的信息。此表存储在 msdb 数据库中。其实看其参数的数据类型,你就知道第二个问题的答案了。呵呵

列名

数据类型

说明

schedule_id

int

SQL Server 代理作业计划 ID。

schedule_uid

uniqueidentifier

作业计划的唯一标识符。此值用于标识分布式作业的计划。

originating_server_id

int

作为作业计划来源的主服务器 ID。

name

sysname (nvarchar(128))

作业计划的用户定义名称。该名称在作业中必须唯一。

owner_sid

varbinary(85)

拥有作业计划的用户或用户组的 Microsoft Windows security_identifier

enabled

int

作业计划的状态:

0 = 未启用。

1 = 启用。

如果未启用计划,则不会运行该计划中的任何作业。

freq_type

int

此计划中作业运行的频率。

1 = 只运行一次

4 = 每天

8 = 每周

16 = 每月

32 = 每月,与 freq_interval 有关

64 = 在 SQL Server 代理服务启动时运行

128 = 在计算机空闲时运行

freq_interval

int

执行作业的间隔天数。该值取決于 freq_type 的值。默认值为 0,表示不使用 freq_interval

freq_type 的值

对 freq_interval 的影响

1(一次)

不使用 freq_interval (0)

4(每天)

freq_interval

8(每周)

freq_interval 为下列一个或多个值:

1 = 星期日

2 = 星期一

4 = 星期二

8 = 星期三

16 = 星期四

32 = 星期五

64 = 星期六

16(每月)

每月的 freq_interval

32(与“每月”选项相关)

freq_interval 为下列值之一:

1 = 星期日

2 = 星期一

3 = 星期二

4 = 星期三

5 = 星期四

6 = 星期五

7 = 星期六

8 = 日

9 = 工作日

10 = 休息日

64 (在 SQL Server 代理服务启动时开始)

不使用 freq_interval (0)

128(在计算机空闲时运行)

不使用 freq_interval (0)

freq_subday_type

int

freq_subday_interval 的单位。可以是下列值之一:

说明(单位)

1

在指定的时间

2

4

分钟

8

小时

freq_subday_interval

int

在每次执行作业之间发生的 freq_subday_type 的周期数。

freq_relative_interval

int

如果 freq_interval32(与“每月”选项相关),则为每月中 freq_interval 发生的时间。可以是下列值之一:

0 = 不使用 freq_relative_interval

1 = 第一次

2 = 第二次

4 = 第三次

8 = 第四次

16 = 最后一次

freq_recurrence_

factor

int

已计划执行的作业之间的周数或月数。仅当 freq_type81632 时,才使用 freq_recurrence_factor。如果此列包含 0,则不使用 freq_recurrence_factor

active_start_date

int

可以开始执行作业的日期。日期格式为 YYYYMMDD。NULL 表示当天的日期。

active_end_date

int

可以停止执行作业的日期。日期格式为 YYYYMMDD。

active_start_time

int

active_start_dateactive_end_date 之间的任意日期开始执行作业的时间。时间格式为 HHMMSS,采用 24 小时制。

active_end_time

int

active_start_dateactive_end_date 之间的任意日期停止执行作业的时间。时间格式为 HHMMSS,采用 24 小时制。

date_created

datetime

创建计划的日期和时间。

date_modified

datetime

上次修改计划的日期和时间。

version_number

int

计划的当前版本号。例如,如果计划已修改 10 次,则 version_number 为 10。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
6月前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
3月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
5月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
129 13
|
5月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
5月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
69 6
|
5月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
453 1
|
4月前
|
SQL 数据库连接 网络安全
SQLServer非默认端口下事务复制代理作业服务无法启动的处理
【8月更文挑战第14天】若SQL Server非默认端口下的事务复制代理作业无法启动,可按以下步骤解决:1) 确认服务器连接字符串正确无误,包括非默认端口号;2) 检查防火墙设置,确保允许非默认端口的连接;3) 核实SQL Server配置已启用非默认端口;4) 查阅代理作业日志寻找错误详情;5) 重启SQL Server与Agent服务;6) 使用工具测试非默认端口的连接性。如问题持续,请寻求专业支持。
|
5月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
371 3
|
4月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
528 0
|
5月前
|
SQL 存储 安全
数据库数据恢复—SQL Server数据库出现逻辑错误的数据恢复案例
SQL Server数据库数据恢复环境: 某品牌服务器存储中有两组raid5磁盘阵列。操作系统层面跑着SQL Server数据库,SQL Server数据库存放在D盘分区中。 SQL Server数据库故障: 存放SQL Server数据库的D盘分区容量不足,管理员在E盘中生成了一个.ndf的文件并且将数据库路径指向E盘继续使用。数据库继续运行一段时间后出现故障并报错,连接失效,SqlServer数据库无法附加查询。管理员多次尝试恢复数据库数据但是没有成功。