如要让数据库进行自动管理则管理员需要预先定义一些可预测的管理任务以及这些任务发送的条件当满足这些指定的条件则数据库会自动运行管理员指定的操作使用自动管理来处理日常事务则让管理员可以抽出时间去关注其他的事情如数据库优化等等更加具有价值的作业
计划就是自动化管理组件的一个成员计划指定了作业运行的时间多个作业可以根据一个计划运行;多个计划也可以应用到一个作业但是这个时间跟我们普通上的几点几分又有差异这个时间不仅指特定的日期或者时间而且还可以表示特定的时间如当SQL Server代理启动的时候或者服务器的CPU使用率处于定义的空闲状态水平时也就是说这里指的时间计划也可以实现一定的条件状态控制简而言之计划作业就是定义使得作业在没有哦能够互交互情况下开始运行的条件包括具体的日期或者特定的在状况通过为作业创建新计划或者将现有的计划添加到作业可以将作业计划设置为自动运行不过在设置自动执行计划的时候需要注意一个问题即一次只能够运行一个作业实例如果在作业按计划运行时尝试手工运行该作业则SQL Server代理将拒绝这个请求另外即使计划未启用作业仍可以为响应警报而运行或者由用户手动运行如果作业计划未启用则任何使用该计划的作业都不会启用该计划
一 计划触发的时间与事件
上面笔者说过计划可以基于特定的时间与事件而触发那么这些具体的时间与事件是什么呢?笔者平时用到的最多的就是如下几种情况
一是特定的日期和时间运行一次这个计划时间在数据库备份的时候特别有用大家都知道数据库备份会占用比较多的系统资源如果在数据库服务器使用高峰期(如白天上班时间)进行备份的话那么会对用户的访问造成比较大的影响为此笔者就把数据库备份的时间放在晚上点之后这个时段相对来说很少有用户会访问数据库此时管理员就可以利用计划功能让其在每天的点之后进行数据库备份这就是基于特定的日期和时间计划的典型应用
二是安重复执行的计划运行这个跟上面讲的特定日期和时间运行一次比较类似只是上面的情况只运行一次而这个按重复执行计划运行则是指会重复运行多次如每天晚上点都进行数据库备份等等在实际工作中特定日期和时间运新一次往往只是针对一些特殊的情况如今天刚对数据库结构进行了比较大的更改如添加了几张表或者视图此时就需要对数据库进行一次完全备份如故不急于进行备份的话则就可以建立一个在特定的日期和时间运行的数据库完全备份计划让其在午后进行数据库备份但是对于常规的数据库备份则需要采取这个按重复执行计划运行
三是当计算机的CPU使用率处于定义的空闲状态水平时也就是说数据库服务器当前的CPU使用率比较低可以执行其他一些比较复杂的管理任务如有些数据库系统在设计的时候有一个库存补货点作业当库存低于安全库存的时候系统就会自动生成一张物料请购单来满足安全库存的需要由于这张表设计到的物料比较多会占用比较多的系统资源故可以设置每天运行一次而运行的时间就定在CPU使用率比较低的时候如此就可以减少对其他作业造成的负面影响
二 CPU空闲计划的典型应用
其他的几种计划类型不少数据库管理员已经非常了解笔者今天想谈的是CPU空闲计划的应用这个计划如果应用的好的话可以大大提高数据库的性能如果要想利用好这个功能则需要回答如下两个问题
一是什么作业需要使用CPU空闲计划?这个问题比较难回答从理论上来说任何作业都可以采用CPU空闲计划在自动执行只是他们带来的效果不同有的作业即使采用了CPU空闲计划也不能够带来很大的性能改善简单的来说一些占用CPU资源比较大的作业采用CPU空间计划规则来自动执行可以取得比较好的效果如数据库有时候需要重新生成索引这项工作会占用比较多的CPU资源而且随着数据量的增多这个CPU使用率也会越来越高为此如果可以把重新生成索引的作业放在CPU空闲时间来进行的话那么对于提高数据库的性能效果是比较明显的总之当某个作业比较复杂可能需要占用到比较多的CPU或者内存资源的话则可以采用这个CPU空闲计划
二是什么时候CPU是空闲的?空闲是一个相对的标准有时会CPU使用率%以下可以定义为空闲;而有时候CPU使用率只有不到%就是空闲这要根据服务器的配置已经所部属的应用来考虑所以管理员在采用CPU空闲计划之前先要对服务器进行观测一定时间采用性能监视器等工具来监视服务器流量并收集相关的统计信息然后利用收集到的信息来分析CPU空闲的标准并在数据库中进行相关的设置将 CPU 空闲条件定义为一个百分比在该百分比以下CPU 使用率必须持续指定的时间然后设置持续时间长度如果 CPU 使用率在指定时间内低于指定的百分比则 SQL Server 代理将启动具有 CPU 空闲时间计划的所有作业如管理员认为CPU使用率在%以下可以运行重建索引的作业即当这个重建索引作业运行时CPU使用率在可以忍受的范围之内此时就可以把CPU的空闲率标准设置为%而且这个低于%的CPU使用率必须要持续一段时间如这个低于%的CPU持续时间很短那么系统仍然不会认为这个CPU是出于空闲状态这个持续时间最好能够参考具体作业的执行时间若重建索引作业所需要的时间等等
三 如何停止计划的自动执行?
有些时间我们可能并不需要自动执行计划如在数据库设计的时候管理员并不需要这些自动执行的计划为此需要把他们暂时停止此时有哪些方法可以做到这一点呢?
一是可以把计划与作业剥离计划与作业是两个独立的内容如数据库完全备份与计划时间就是相互独立的如果设置好了数据库完全备份的策略但是没有把计划时间与这个作业进行关联的话则数据库完全备份不会自动执行此时如果需要执行这个作业的话则就要进行手工启动故当管理员暂时不想要某个计划的时候可以把计划作业剥离即在作业中去掉这个时间计划即可
二是禁用作业或者计划当管理员不需要某个作业自动运行的时候可以把这个计划或者作业进用掉禁用计划或者禁用作业都会让某个作业停止自动运行但是他们仍然有微小的差异如禁止计划的话只是这个这个作业停止自动运行但是管理员仍然可以手工执行它可是禁用作业的话则系统不仅不会自动运行而且管理员还不能够手工执行它这就好像给这个作业设置了终身监禁为此为了避免这种情况的发生笔者是建议最好采用禁用计划而不是禁用作业如此的话在必要的时候管理员还可以手工启动该作业来应急另外如果这个计划将来仍然需要采用的话笔者不建议把计划与作业剥离的方式来停止计划的自动执行;而是建议这种禁用计划的方式来完成不然的话下次需要的时候仍然需要把计划与作业关联反而会增加工作量
另外如果这个测试计划以后再也不用时有两种处理方法一是把计划直接删除这个是最彻底的方法但是不会留下任何历史纪录二是先把计划跟作业玻璃然后再禁用这个计划这虽然比较麻烦一点而且会在数据库中留下垃圾数据但是却可以保留历史纪录这可能会对数据库的后续维护带来一定的帮助到底不用的计划是删除还是禁用没有一个统一的标准还是需要根据数据库管理员的操作习惯来判断
无论采取哪种方式管理员都需要注意两点内容一是必须显示的重新启动已禁用的计划如果管理员只是更改了已禁用的计划策略并不会重新启动这个计划而需要管理员手工的启动二是即使计划未启用作业仍可以为响应警报而运行或者由用户手动运行如果作业计划未启用则任何使用该计划的作业都不会启用该计划