解决job重复执行的问题

最近发现一个数据库服务器的维护计划每天会被执行两次,一次是20:30,另一次是凌晨3:00。

第一次是我设置的,通过维护的属性就能够看到。3点多的那次怎么跑出来的我就不知道了。

任何事务都可以成段或者分成块,如果知道每个块(object)之间关系,问题就比较容易解决了。

一个维护任务大概可以分成三块,做什么、谁来做、什么时间做。换成SQL SERVER的方式就是,把个备份(做什么)的维护计划由sql server agent(谁来做)在每天8点半(什么时间做)执行。在建立一个维护任务(MaintenancePlan)的时候会生成一个与之对应的作业(job),job包括启动时间也就是chedule。

 

在这个故障里面维护任务被执行了两次,那么job也一定会被执行两次,我们可以查看job执行的情况,看看有没有蛛丝马迹。(实际上,在我一头雾水的时候,首先查看的是job的情况)

可以看出是计划43和计划44分别调用了同一个job,导致维护基本被执行了两次。但我不能确定这里计划44的“计划”二字到底是指什么,于是找了一个全英文的SQL SERVER,看了一下job的历史,是这么写的 The job succeeded.  The Job was invoked by Schedule 9 (FULL_BACKUP_ALL.Subplan_1).  The last step to run was step 1 (Subplan_1).  看样子是是指Schedule ,这个时候原因就比较容易解释了,编号为43和44的Schedule 调用相同的job,导致被执行了两次。看来只要找出43和44这两个Schedule 并删掉其中多余的一个,然后需要删掉Schedule 与job之间的对应关系,问题就能解决。

我知道这些Schedule 、 job、MaintenancePlan记录在msdb库中,但具体在哪个表我不知道,以 Schedule为关键字在联机丛书中搜索出100多个结果,当然我不会傻的一个个去看了。

使用 一个查询就能找出来了:


  1. SELECT * FROM sys.sysobjects WHERE name LIKE '%Schedule%' AND type IN ('u','v'

就三个结果,用select * 一个个的看好了。

在SysSchedules 里面就找到43和44号:

 

把43号删掉就好了。也在sysjobschedules中也找到与job之间的对应关系,也删掉。下图是删掉之后的结果。

没事应该多翻翻联机丛书,了解每个系统表 系统视图 动态视图是做什么用的,有助于提高我们的水平。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章