热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

SQLSERVER作业的Schedules浅析

SQLSERVER作业的计划(Schedules),如果你没仔细研究过或没有应用一些复杂的计划(Schedules),那么你觉得SQLSERVER作业的计划(Schedules)非常好用,也没啥问题,但是我要告诉你一个残酷的真相,相比Linux系统的Crontab,SQLSERVER作业的计划其实是一个

SQL SERVER作业的计划(Schedules),如果你没仔细研究过或没有应用一些复杂的计划(Schedules),那么你觉得SQL SERVER作业的计划(Schedules)非常好用,也没啥问题,但是我要告诉你一个残酷的真相,相比Linux系统的Crontab,SQL SERVER作业的计划其实是一个

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

; ; (SUBSTRING(CONVERT(VARCHAR(16), GETDATE(), 120),11,3) AS INT); (SUBSTRING(CONVERT(VARCHAR(16), GETDATE(), 120),15,2) AS INT); BI_JOB_LOG (); --执行业务逻辑代码 ........................... END; 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_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。

推荐阅读
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
author-avatar
mobiledu2502872825
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有