解決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之間的對應關係,也刪掉。下圖是刪掉之後的結果。

沒事應該多翻翻聯機叢書,瞭解每個系統表 系統視圖 動態視圖是做什麼用的,有助於提高我們的水平。

 

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