SQL SERVER作业的Schedules浅析
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,即表示这个时间点作为第一次执行的参照点。
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时才执行存储过程。
- 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分钟还是准时执行了。
要查看作业下次执行时间,可以通过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_subday_type |
int |
freq_subday_interval 的单位。可以是下列值之一:
|
||||||||||||||||
freq_subday_interval |
int |
在每次执行作业之间发生的 freq_subday_type 的周期数。 |
||||||||||||||||
freq_relative_interval |
int |
如果 freq_interval 为 32(与“每月”选项相关),则为每月中 freq_interval 发生的时间。可以是下列值之一: 0 = 不使用 freq_relative_interval 1 = 第一次 2 = 第二次 4 = 第三次 8 = 第四次 16 = 最后一次 |
||||||||||||||||
freq_recurrence_ factor |
int |
已计划执行的作业之间的周数或月数。仅当 freq_type 为 8、16 或 32 时,才使用 freq_recurrence_factor。如果此列包含 0,则不使用 freq_recurrence_factor。 |
||||||||||||||||
active_start_date |
int |
可以开始执行作业的日期。日期格式为 YYYYMMDD。NULL 表示当天的日期。 |
||||||||||||||||
active_end_date |
int |
可以停止执行作业的日期。日期格式为 YYYYMMDD。 |
||||||||||||||||
active_start_time |
int |
在 active_start_date 和 active_end_date 之间的任意日期开始执行作业的时间。时间格式为 HHMMSS,采用 24 小时制。 |
||||||||||||||||
active_end_time |
int |
在 active_start_date 和 active_end_date 之间的任意日期停止执行作业的时间。时间格式为 HHMMSS,采用 24 小时制。 |
||||||||||||||||
date_created |
datetime |
创建计划的日期和时间。 |
||||||||||||||||
date_modified |
datetime |
上次修改计划的日期和时间。 |
||||||||||||||||
version_number |
int |
计划的当前版本号。例如,如果计划已修改 10 次,则 version_number 为 10。 |
SQL SERVER作业的Schedules浅析的更多相关文章
- SQL Server 作业监控
原文:SQL Server 作业监控 在讲解SQLServer Agent Jobs之前,先要讲解msdb. Msdb是SQLServer的系统数据库之一,用于存储SQLServer的配置.元数据等信 ...
- SQL Server on Linux 理由浅析
SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...
- 【解决】SQL Server作业中Excel Application不能访问文件
在通过SQL Server作业来实现定时任务时,出现如下错误: FullyQualifiedErrorId : ComMethodTargetInvocation使用“1”个参数调用“Add”时发生异 ...
- SQL Server作业没有执行的解决方法
SQL Server作业没有执行的解决方法 确保SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行 设置方法: 我的电脑--控制面板--管理工具--服务--右键 SQLSE ...
- SQL SERVER 作业问题(SET 选项的设置不正确: 'QUOTED_IDENTIFIER'。),以及其它定时sql执行方式探索
在实时曲线测试平台中,需要用到实时测试数据作为依据,评估程序的可靠性.在编写sql server作业时,出现了一些问题,经过研究给予解决,供大家参考. 1.编写脚本如下: declare @i int ...
- SQL SERVER 作业浅析
作业介绍 SQL SERVER的作业是一系列由SQL SERVER代理按顺序执行的指定操作.作业可以执行一系列活动,包括运行Transact-SQL脚本.命令行应用程序.Microsoft Activ ...
- 使用SQL Server作业设置定时任务
1.开启SQL Server Agent服务 使用作业需要SQL Agent服务的支持,并且需要设置为自动启动,否则你的作业不会被执行. 以下步骤开启服务:开始-->>>运行--&g ...
- SQL SERVER 作业(或叫执行计划)
如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时,可以用管理->SQL Server代理->作业来实现. 1.管理->SQL S ...
- SSIS结合BCP及SQL Server作业实现定时将数据导出打包实现数据同步
首先这个流程要实现的功能大致是: 有两台服务器,一台是对外网开发的,一台是内网的.那么很明显数据交互都是外网服务器在做,而这个流程要做的就是要将外网上面的数据定时同步到内网中. 我们依对其中某张表的操 ...
随机推荐
- ssh整合问题总结--运行项目时报java.lang.StackOverflowError(堆栈溢出)异常
今天在整合ssh项目中,碰到一个异常,当我提交购物车数据到订单时,浏览器报了一个这样的异常. 当时,我就吓坏了.尼玛,这不是内存溢出了吗?吓得我赶紧去检查了每一个有遍历语句的代码,结果没有发现一个死循 ...
- 3.Struts2配置文件标签介绍
Struts2的很多核心功能都是由拦截器实现的. struts-default.xml中定义了这些拦截器与Result类型. 所以,不继承struts-default包,Struts2提供的很多核心功 ...
- 浅谈MITM攻击之信息窃取(解密315晚会报道的免费WIFI窃取个人信息)
前言 所谓的MITM攻击(即中间人攻击),简而言之就是第三者通过拦截正常的网络通信数据,并进行数据篡改和嗅探,而通信的双方毫无感知.这个很早就成为黑客常用的手段,一会聊的315晚会窃取个人信息只是 ...
- JSP自定义tag
前端需要调用后端的配置,想起velocity-tools.然而jsp的话,目前只能想到tag和EL表达式了. Tag相当好写,jsp2.0提供了简化写法: 编写一个java类: public clas ...
- 背水一战 Windows 10 (28) - 控件(文本类): TextBox, PasswordBox
[源码下载] 背水一战 Windows 10 (28) - 控件(文本类): TextBox, PasswordBox 作者:webabcd 介绍背水一战 Windows 10 之 控件(文本类) T ...
- 什么是Servlet?
HTML只能用来保存静态内容,而通常情况下,静态页面很难满足实际应用的需要,鉴于此,动态页面被引入.所谓动态页面,指的是能够根据不同时间,不同用户而显示不同内容的页面,例如常见的论坛.留言板.电子商务 ...
- Linux命令详解之—tail命令
tail命令也是一个非常常用的文件查看类的命令,今天就为大家介绍下Linux tail命令的用法. 更多Linux命令详情请看:Linux命令速查手册 Linux tail命令主要用来从指定点开始将文 ...
- tarjan讲解(用codevs1332(tarjan的裸题)讲解)
主要借助这道比较裸的题来讲一下tarjan这种算法 tarjan是一种求解有向图强连通分量的线性时间的算法.(用dfs来实现) 如果两个顶点可以相互通达,则称两个顶点强连通.如果有向图G的每两个顶点都 ...
- 从零开始学 Java - CentOS 下安装 Tomcat
生活以痛吻我,我仍报之以歌 昨天晚上看到那个冯大辉老师的微信公众号,「小道消息」上的一篇文章,<生活以痛吻我,我仍报之以歌>.知乎一篇匿名回答,主题为<冯大辉到底是不是技术大牛,一个 ...
- ASP对XML的增、删、改、查
首先看一下xml文件 text.xml 'encoding使用gb2312中文,如果要用英文则用utf-8 <?xml version="1.0" encoding=&quo ...