﻿# SQL Server 維護計畫與 SQL Server Agent 作業之間的關係

我們一般做 SQL Server 維護都會設定一套維護計畫，並且使用 Management Studio 工具幫我們建立，且建立完成後會在 SQL Server Agent 建立起對應的作業與排程，前陣子我公司負責管理資料庫的同仁因為設定 **SQL 記錄傳送** (**Log Shipping**) 的關係將原本維護計畫中的交易記錄備份停用，但是他並不是在**維護計畫**中設定停用，而是直接到 SQL Server Agent 的作業中停用，導致今天發生的一場資料庫災難。

這個故事是這樣的：

-   原本**維護計畫**設定的**交易記錄備份**都是正常運作的
-   設定了 **SQL 記錄傳送** (**Log Shipping**) 之後，就改由 **SQL 記錄傳送** 來負責做**交易記錄備份**
-   前陣子因為 **SQL 記錄傳送** (**Log Shipping**) 次要伺服器的主機硬碟空間不夠，所以停用了
-   當時就再次重新啟用 **維護計畫** 設定的 **交易記錄備份**
-   因為從那時開始**交易記錄備份**都沒有正常執行，導致今天交易記錄檔把我正式機的硬碟塞爆了！

這段過程我都沒有經手，資料庫的維護計畫的執行作業也都沒有報錯，所以也覺得不疑有誤，但詭異的地方就是為什麼**維護計畫**的**交易記錄備份作業**不再備份了呢？

底下是一個維護計畫與 SQL Server Agent 作業的畫面，這會讓你感覺好像每一個在維護計畫建立的子計畫都建立一個SQL Server Agent 作業，另外一個重點是如下圖的紅線，代表如果交易記錄備份失敗會自動發信通知操作員：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/962d90b17fa3fe27b05c-image.png)

首先，所有我們在維護計畫所定義的作業內容，並不是一個單純的 T-SQL 執行或是許多步驟結合在一起的複雜作業，而是 SSIS 的封裝，如下圖是其中一個作業的屬性，點擊「步驟」頁面可以看到每個透過維護計畫建立的作業都只會有一個步驟，且類型皆為 **SQL Server Integration Services 封裝 ( SSIS Package )**：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/a65d309002c7c2b9251c-image.png)

接下來，我就要說明這次災難發生的原因了。

經過調查之後發現，之前同事因為設定 **SQL 記錄傳送** (**Log Shipping**) 的關係，直接到 SQL Server Agent 直接將作業設為「停用」，這樣做基本上是沒錯，作業真的會停用，交易記錄備份也不會再繼續運作，而之後就由 **SQL 記錄傳送** 來做交易記錄備份的工作：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/5fb1c91f22b921480569-image.png) 

但前陣子 **SQL記錄傳送** 因故停用了，所以必須復原原本維護計畫中的交易記錄備份作業，但這段時間該同事離職了，也沒交代到一些細節，所以我也就依照他的方式重新再將作業**啟用**，但你知道為何作業就算啟用了為何還不會執行呢？原因就在於，前同事除了將作業停用外，還額外停用了該作業的排程，這是我萬萬沒想到的事，而且從**上圖**的外觀上並不會直覺的想到「排程」被關閉這件事：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c09d8a8e72950654934b-image.png)

所以這次學到的教訓就是『**千萬不要手動修改透過維護計畫設定的 SQL Server Agent 作業，請一律使用維護計畫中的 SSIS 設計工具來停用特定工作**』。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/50c9f3b9563508469dbc-image.png)

鄉親阿~~ (台語口音)，老話一句 魔鬼總在細節裡 不是說假的，在我的部落格裡搜尋「魔鬼」已經可以搜出不少篇了，可見我經常在跟魔鬼打交道，呵呵～ XD

**心得分享**

今天也跟 SQL 界的資深前輩聊了一下，我問他：「**請問你深厚的 SQL 功力都是從這些日常的災難中鍛鍊出來的嗎？**」，他沒說些什麼，就點了點頭然後笑了一下。如果去外面上課，這些日常的災難通常老師不會教太深入，學生也不會練習的很透徹，唯有真的上戰場遇到的狀況才能深刻體會，這時這些災難復原的經驗才是你的，不容易阿～～～～

人家常說，夜路走多了總會遇到鬼，我怎麼覺得跟鬼打交道多了總是不怕鬼，這代表著些什麼呢？從事技術行業，還是要培養追根究底的精神，不管你學歷多低或多高，這是一種習慣，養成習慣就好，遇到問題無論如何要找到發生問題的主因，並且釐清問題背後的問題，這樣才有可能不斷進步，下次再遇到同一個類型的鬼，就再也不怕了。
