1 . 背景描述

本公司的SQL Server 服务器近百台,为了收集服务器运行的状态,需要在各个实例上部署监控Job,将收集到的信息推送到中央管理服务器。

收集的信息主要包括:慢查询、阻塞、资源等待、Connection_Trace log 、Job执行状态、复制订阅状态、Alwayson状态、数据库字典(特别是索引)等各种记录。

因此,对这些的Job的维护工作也是日常工作的一部分,为了集中统一管理,我们将各个SQL Server 都注册到了一台服务器上。这样也方便集中统一部署、更新 Job Script,不需要逐个登入服务器进行部署更新了。

注册服务器的管理是通过SSMS来实现的。点击 视图-->已注册的服务器

<图-1>

打开后,我们可以进行管理。为便于管理,我们将 本公司SQL Server分成了三组 FileDB 、Master、Slave。主要考虑这三种类型部署管理的脚本不一样,例如部署在Master机器上的脚本根本不需要部署在Slave上面, 相同型的机器归拢到一个组别中。

<图-2>

2. 通过中央管理服务器部署Job

监控Job的部署,如果通过注册服务来管理的话,只能通过脚本来实现。

我们先在一台SQL Server上产生需要执行的脚本,然后,再在中央管理服务器上执行。产生创建脚本可以通过点击  配置Job界面上的【脚本】按钮产生。(逐步配置,最后点击【脚本】即可)

<图-3>

在这个案例中,我们设置的Job的功能 是 每隔5分钟执行 master数据库下面的一个SP: USP_TestForDBA_TestJOBSchedule,即运行的SQL命令 为 exec USP_TestForDBA_TestJOBSchedule。Job的名称为DBA_TestJob_Schedule。

那么导出的创建Job的script如下:

USE [msdb]
GO
DECLARE @jobId BINARY(16)
EXEC msdb.dbo.sp_add_job @job_name=N'DBA_TestJob_Schedule',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=2,
@notify_level_netsend=2,
@notify_level_page=2,
@delete_level=0,
@description=N'此为测试案例,无实际意义',
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'sa', @job_id = @jobId OUTPUT
select @jobId
GO
EXEC msdb.dbo.sp_add_jobserver @job_name=N'DBA_TestJob_Schedule', @server_name = N'XXXXXXXXXX'
GO
USE [msdb]
GO
EXEC msdb.dbo.sp_add_jobstep @job_name=N'DBA_TestJob_Schedule', @step_name=N'Step1',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_fail_action=2,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0, @subsystem=N'TSQL',
@command=N'exec USP_TestForDBA_TestJOBSchedule',
@database_name=N'master',
@flags=0
GO
USE [msdb]
GO
EXEC msdb.dbo.sp_update_job @job_name=N'DBA_TestJob_Schedule',
@enabled=1,
@start_step_id=1,
@notify_level_eventlog=0,
@notify_level_email=2,
@notify_level_netsend=2,
@notify_level_page=2,
@delete_level=0,
@description=N'此为测试案例,无实际意义',
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'sa',
@notify_email_operator_name=N'',
@notify_netsend_operator_name=N'',
@notify_page_operator_name=N''
GO
USE [msdb]
GO
DECLARE @schedule_id int
EXEC msdb.dbo.sp_add_jobschedule @job_name=N'DBA_TestJob_Schedule', @name=N'Schedule1',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=4,
@freq_subday_interval=5,
@freq_relative_interval=0,
@freq_recurrence_factor=1,
@active_start_date=20181201,
@active_end_date=99991231,
@active_start_time=0,
@active_end_time=235959, @schedule_id = @schedule_id OUTPUT
select @schedule_id
GO

3. 待优化的问题

这份代码,如果同时部署在多台服务器上,有没有潜在的问题,或者说有没有优化的地方呢?

答案是肯定的,有!!!

收集监控数据的SP中,有向中央管理服务器Insert数据的功能,如果各个服务器同时插入,则会出现排队,甚至出现超时报错的问题。

查看每台服务器Job,以上代码对应的Schedel属性,其开始时间是一模一样的。这不是我们想要的。

<图-4>

如果是每隔五分钟执行一次,其实,我们希望各个Job之间的 开始时间可以随机 在00:00:00--00:05:00分布。这样,各个Job 之间开始执行的时间随机, 撞车的概率大大减少,向中央服务器插入数据排队也会减少

那么如何实现呢?

4. 代码优化

仔细分析上面的创建代码,其实它包含了sp_add_job、sp_add_jobserver、sp_add_jobstep、sp_update_job、sp_add_jobschedule五个部分。每个部分基本上对应添加Job界面的一个动作。如果调整各个Job的开始时间,就要想办法调整 【作业计划属性】界面上的【开始时间】 设置。图-4 作业计划 属性 对应  sp_add_jobschedule 代码 部分。

代码中的开始时间 为参数 @active_start_time

分析到这儿,相信部分同学已经有思路了。

OK,我们直接分享更新后的代码。其它代码部分不做调整,只调整最后 sp_add_jobschedule 部分的代码

调整后如下:

USE [msdb]
GO
DECLARE @schedule_id int
------------------------------- start -- Job schedule 开始时间在指定范围内随机产生 20181015 Carson Xu-----------------
Declare @Randstart_time int ----分布式数据库Job 开始时间指定范围随机产出,减少并发等待
select @Randstart_time=cast( floor(rand()*5) as int) * 100 +cast( floor(rand()*60) as int)--5 代表5分钟内的随机数,60 代表60 秒内随机数。
---将参数随机值 赋予 存储中的 sp_add_jobschedule 的@active_start_time就OK了。即代码中的@active_start_time=@Randstart_time.
---active_start_time 的数据类型为 int,无默认值。时间格式为 HHMMSS,采用 24 小时制。
---cast( floor(rand()*5) as int) * 100 +cast( floor(rand()*60) as int) 其实默认了开始时间(小时是00开始),完整应该是0*100000+cast( floor(rand()*5) as int) * 100 +cast( floor(rand()*60) as int)
---如果是8点就应该是8*100000+cast( floor(rand()*5) as int) * 100 +cast( floor(rand()*60) as int)
--------------------------------end ----------------------------------------------------------
EXEC msdb.dbo.sp_add_jobschedule @job_name=N'DBA_TestJob_Schedule', @name=N'Schedule1',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=4,
@freq_subday_interval=5,
@freq_relative_interval=0,
@freq_recurrence_factor=1,
@active_start_date=20181201,
@active_end_date=99991231,
@active_start_time=@Randstart_time,
@active_end_time=235959, @schedule_id = @schedule_id OUTPUT
select @schedule_id
GO

5. 验证

图-5、图-6 是用上面相同代码生成的Job, 而查看其作业计划的开始时间不同,为随机产生的,符合了代码优化的要求。

<图-5>

此Server上的这个Job的开始时间是00:04:40执行,每隔5分钟执行一次。

<图-6>

此Server 上的Job为00:00:28 分钟执行,每隔5分钟执行一次,与图-5的时间点是不同的,完美的错开了。

 本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!

本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!

本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!

SQL Server创建Job, 实现执行相同脚本而产生不同作业计划的探究的更多相关文章

  1. SQL Server 创建表分区

    原文:SQL Server 创建表分区 先准备测试表 CREATE TABLE [dbo].[Employee] ( EmployeeNo ,) PRIMARY KEY, EmployeeName ) ...

  2. SQL server 创建 修改表格 及表格基本增删改查 及 高级查询 及 (数学、字符串、日期时间)函数[转]

    SQL server 创建 修改表格 及表格基本增删改查 及 高级查询 及 (数学.字符串.日期时间)函数   --创建表格 create table aa ( UserName varchar(50 ...

  3. SQL Server创建表超出行最大限制解决方法

    问题的现象在创建表A的时候,出现“信息 511,级别 16,状态 1,第 5 行  无法创建大小为 的行,该值大于允许的最大值 8060.”的信息提示.很奇怪,网上查了一下,是因为要插入表的数据类型的 ...

  4. SQL Server创建、更改和删除架构

    SQL Server创建架构 学习如何使用SQL Server CREATE SCHEMA在当前数据库中创建新架构. SQL Server中的架构是什么 架构是包括表,视图,触发器,存储过程,索引等在 ...

  5. SQL Server 创建表

    SQL Server 创建表 我们在上一节中完成了数据库的创建,在本节,我们要往这个新的数据库中加入点数据,要想将数据添加到数据库,我们就必须在数据库中添加一个表,接下来来看看具体的操作. 我们的数据 ...

  6. sql server中如何查看执行效率不高的语句

    sql server中,如果想知道有哪些语句是执行效率不高的,应该如何查看呢?下面就将为您介绍sql server中如何查看执行效率不高的语句,供您参考.   在测量功能时,先以下命令清除sql se ...

  7. SQL Server创建索引

    原文:SQL Server创建索引 什么是索引 拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K .为了加快查找的 ...

  8. SQL Server 创建索引方法

    转自 <SQL Server 创建索引的 5 种方法> 地址:https://www.cnblogs.com/JiangLe/p/4007091.html 前期准备: create tab ...

  9. [SQL] sql server中如何查看执行效率不高的语句

    sql server中,如果想知道有哪些语句是执行效率不高的,应该如何查看呢?下面就将为您介绍sql server中如何查看执行效率不高的语句,供您参考.在测量功能时,先以下命令清除sql serve ...

随机推荐

  1. 结合JDK源码看设计模式——桥接模式

    前言: 在我们还没学习框架之前,肯定都学过JDBC.百度百科对JDBC是这样介绍的[JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Jav ...

  2. OpenProject基础使用介绍

            所有的活动都可以看做一个项目来管理.在企业中更是这样. 所以项目管理平台,对于任何一个高科技企业来讲都是必不可少的. OpenProject(以下简称OP)就是一个不错的项目管理平台, ...

  3. [LeetCode] 25. k个一组翻转链表

    题目链接: https://leetcode-cn.com/problems/reverse-nodes-in-k-group/ 题目描述: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链 ...

  4. POST不同提交方式对应的Content-Type,及java服务器接收参数方式

    POST不同提交方式对应的Content-Type,及java服务器接收参数方式 注:本博客参考了网上的文章结合自己工作总结后所写,主要用于记录自己工作所得,如有错误请批评指正. 简介: Conten ...

  5. 线性回归预测PM2.5----台大李宏毅机器学习作业1(HW1)

    一.作业说明 给定训练集train.csv,要求根据前9个小时的空气监测情况预测第10个小时的PM2.5含量. 训练集介绍: (1)CSV文件,包含台湾丰原地区240天的气象观测资料(取每个月前20天 ...

  6. springboot打包不同环境配置与shell脚本部署

    本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作: profiles指定不同环境的配置 maven-assembly-plu ...

  7. 【python3基础】相对路径,‘/’,‘./’,‘../’

    python3相对路径 “/” 前有没有 “.” ,有几个“.”,意思完全不一样. “/”:表示根目录,在windows系统下表示某个盘的根目录,如“E:\”: “./”:表示当前目录:(表示当前目录 ...

  8. 【Android Studio安装部署系列】十一、Android studio获取数字签名信息

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 下面介绍下调试版本和发布版本获取数字签名的方法,通过以下方法可以获取到SHA1和MD5. 一般在使用分享功能,在第三方平台中创建应用 ...

  9. dev treelist和searchcontrol组合模糊查询用法

    这里需要用到两个控件,是dev的treelist和searchcontrol,首先呢树形控件要形成树形我在这就不多说了 因为这里是记录下searchcontrol这控件的用法 首先写这三行代码,里面都 ...

  10. 旅行商问题(Traveling Salesman Problem,TSP)的+Leapms线性规划模型及c++调用

    知识点 旅行商问题的线性规划模型旅行商问题的+Leapms模型及CPLEX求解C++调用+Leapms 旅行商问题 旅行商问题是一个重要的NP-难问题.一个旅行商人目前在城市1,他必须对其余n-1个城 ...