31

31. 管理作業自動化

SQL Server代理程式服務

作業

警示

SQL Server代理程式錯誤記錄檔

本章總結

在 第 30 章 中我們看了幾項自動化設定的選項，以及 SQL Server 2000 提供的資料庫選項，這些選項幫助 DBA 減少了的調整作業。在本章中將學會使用 SQL Server 提供的輔助工具，以透過 SQLServer 代理程式服務來自動執行其他的管理作業。SQLServer 代理程式服務包括自動定期執行資料庫的特定作業，以及伺服器發生問題或事件時，通知 DBA 或其他特定人員。這些功能的好處使得 DBA 不需要用手動或不斷監控資料庫系統來決定何時執行特定作業，因此有更多時間用在更難的資料庫問題上，如建立和調整索引、最佳化查詢、或者為未來的成長預作計畫。

自動化管理作業有三個主要工具：作業、警示、和操作員。在本章中，您將學會關於 SQLServer 代理程式服務，以及如何使用服務來建立及使用作業、警示、與操作員。您也可以找到關於 SQLServer 代理程式錯誤紀錄，這個紀錄可用來追蹤 SQLServer 代理程式執行的工作。

SQLServer 代理程式服務

SQLServer 代理程式執行從 SQL Server 獨立出來的服務，稱為 SQLServer 代理程式。這個服務包含在 SQL Server 2000 之中，但是必須單獨啟動，手動或自動均可。

第 8 章 有關於啟動 SQLServer 代理程式的方法說明。一旦啟動服務，就要準備好定義所需要的作業、警示、和操作員。

說明

SQLServer 代理程式服務在 Microsoft SQL Server 6.5 中被稱為 SQL Executive。它也可以用作複寫，如 第 26 、 27 、 28 章 的說明。

作業

作業 （Jobs）是管理任務，只要定義一次就可以執行好幾次。您可以手動執行作業，或者用 SQL Server 安排在特定時間執行，也可以定期執行或是警示發生時執行（

< 警示 > 稍後會作說明）。作業可以由 SQL Server 陳述式、Windows NT 或 Windows 2000 指令、可執行程式、ActiveX 指令碼組成。作業也可以在您使用複寫或建立資料庫維護計劃時自動幫您建立。一個作業可由單一步驟或很多步驟組成，而每個步驟可以是一個更複雜的呼叫組合步驟─例如呼叫預存程序。SQL Server 自動監控作業的成敗﹔兩種情況都可以設定警示。

作業可以在本地端伺服器執行，或者您在網路上有多重伺服器，可以指定一台作為主要伺服器，其他的作為目標伺服器。主要伺服器替全部的伺服器儲存作業定義，並且作為作業清理處，協調一切作業活動。每個目標伺服器定期與主要伺服器相連，若有作業變更就更新作業清單，從主要伺服器下載新作業，然後切斷連線來執行新作業。當目標伺服器完成作業時，它會再與主要伺服器連接並報告它的結束狀況。

我們來看看建立作業的一個假設情況。假設您有個資料庫資料表，保存了每筆銀行的交易紀錄，例如存提款和轉帳。每筆記錄有一個 timestamp 資料行說明交易何時發生。這個資料表將不斷增長並且需要定期刪除資料。要從資料表中刪除一列，您可以用 DELETE 陳述式寫一個小的預存程序來刪除兩個月之前的舊資料（假設銀行只要保留兩個月的資料）。接著您可以建立一個作業來執行這個預存程序，例如每週日晚上執行一次。這樣一來，您可以確保資料表不會無限制地增長。這不但可以保留磁碟空間，而且還能提昇效能。執行查詢時表格中的資料越少，SQL Server 就能越快完成查詢。現在讓我們來看看建立作業的細節。

說明

SQLServer 代理程式服務必須依序執行才能使您的作業正常運作。

建立作業

您可以用 Enterprise Manager、T-SQL 指令檔、建立作業精靈、或 SQL-Distributed Management Objects (SQL-DMO)來定義作業。因為 SQL-DMO 方法與電腦的程序編制有關，不在本書的範圍之內。本章節您將學會其他三種有關建立作業的方法。

相關資訊

關於使用 SQL-DMO 來建立作業，請參閱< 線上叢書 >並索引< SQL-DMO >。

使用 Enterprise Manager

先用 Enterprise Manager 建立作業。最常用的方法之一是執行資料庫備份（這也可以如 第 30 章 所提的利用 維護計劃精靈 來完成）。下面的例子是建立作業備份 MyDB 資料庫。它安排備份在每晚 11:00 執行，並在 Windows NT 或 Windows 2000 應用事件紀錄和輸出檔案中紀錄備份作業的成敗。跟著下面步驟建立名為 MyDB_backup_job 的作業：

1. 在 Enterprise Manager 左邊的窗格中，展開一個伺服器資料夾，展開 管理 資料夾，然後展開 SQL Server代理程式 資料夾。在 作業 上點選右鍵並在快顯功能表上選擇 新增作業 。顯示 新增作業屬性 視窗，如圖31-1所示。

   圖31-1 新增作業屬性 視窗的 一般 頁籤

- 在 一般 頁籤中設定下列選項：
  - 名稱 鍵入作業名稱─這裡是在文字方塊中鍵入『MyDB_backup_job』。作業名稱最多可以有 128 個字元。伺服器上的每個作業都必須是唯一的名稱，並要確定使用描述性的名字。
  - 啟用 該核取方塊指定作業應該啟動還是停用。您可能想要先停用作業以手動測試來確保運作正常。測試後得知運作正常，就可以用這個核取方塊啟動作業，這樣作業就能如期執行。
  - 作業類別 為這個作業選擇類別-在這個例子中，我們使用預設類別 未分類（本機） 。您可以從已建立的作業類別中選擇，這些作業類別是安裝 SQL Server 時建立的，或者也可以建立您自己的類別（想學習如何建立新類別，請參閱本章後面 < 建立新類別 > 一節）。安裝的類別有 Uncategorized （Local）、資料庫維護計劃、全文檢索、Web 輔助程式，還有複寫的 10 個類別。類別是用來歸類相關作業的。例如，您可以將用來執行資料庫維護的作業歸於同一個類別中，或是依部門分類，如會計、銷售、和市場行銷。類別讓您能夠追蹤多重作業-您就不須為了一小部份的作業而花時間搜尋所有作業清單。
  - 擁有者 建立作業的使用者。只有 sysadmin 角色可以更改誰擁有作業或是變更其他使用者擁有的作業（SQL Server 角色將在 第 34 章 中說明）。所有 sysadmin 角色與作業擁有者都可以改變作業的定義，也可以啟動或停止作業。在 擁有者 下拉式選單中，選擇將執行作業的使用者。本例中，作業擁有者和建立作業者是同一人，所以擁有者會自動選擇正確的設定，而您可以讓這個設定自行運作。
  - 描述 在該文字方塊中，必須確認一個作業要執行什麼任務以及作業的目的。您應該提供描述，描述讓其他使用者很快決定作業的功能。描述最多可有512個位元。
  - 目標為本機伺服器 如果點選這個選項，作業將只在本機伺服器上執行。如果有遠端伺服器連接到這個伺服器上的話，就可以使用 目標為多重伺服器 的選項。點選這個選項來指定遠端伺服器上也要執行這個作業。

完整的樣本作業 一般 頁籤顯示如圖31-2所示。

圖31-2　填入一般頁籤

- 點選 步驟 頁籤，再點選 新增 ，就會顯示 新增作業步驟 對話方塊，如圖31-3所示。 作業步驟(Job steps) 是定義作業任務的指令或陳述式。每個作業必須至少有一個作業步驟，也可以有多重步驟。在 新增作業步驟 中的 一般 頁籤對話方塊中輸入下列資訊：
  - 在 步驟名稱 字方塊中鍵入步驟名稱-在這個例子中是輸入『MyDB_backup』。
  - 從 型別 下拉式選單中，選取一種步驟類型來執行。在這個例子中， 因為要用 T-SQL 指令來執行作業，所以選取 Transact-SQL 指令碼（TSQL） 。其他選項為 ActiveX Script、作業系統命令、複寫散發者、複寫交易記錄讀取程式、複寫合併、複寫佇列讀取器、和複寫快照。
  - 從 資料庫 下拉式選單中選擇要執行作業的資料庫名稱。在這個例子中，選擇 MyDB 資料庫。
  - 在 命令 文字方塊中鍵入將作為一部份作業步驟的指令，在這個例子中，指令是 T-SQL 指令，用來將 MyDB 資料庫備份到一個叫做 MyDB_backup1 的備份裝置上。（這個備份裝置必須事先建立好， 第 32 章 中有建立備份裝置的詳細說明。還有，這個簡單的例子中，資料庫備份每晚會被寫入同一個檔案中。實際上，您應該如 第 30 章 所言使用資料庫維護計劃來執行備份，就像它會讓您每天建立新的備份裝置一樣。）如果有一個準備好的指令檔，您想要用它作為作業，也可以點選 開啟舊檔 來開啟檔案。
- 點選 剖析 ，檢查 T-SQL 步驟的語法，然後點選 進階 頁籤並設定選項，如圖31-4所示。在這個頁籤中，您可以選擇作業成功或失敗後執行的動作：結束作業回報成功、結束作業回報失敗、或是跳到下一個步驟。您也可以指定作業沒有成功時應該重試的次數，以及兩次重試的間隔時間。 如果這個作業包含 T-SQL 指令或是指令碼，您可以選擇一個輸出檔，裡面將有 T-SQL 的輸出報告。您也可以在每次作業執行時，將輸出附加在這個檔案後，或是每次都覆寫輸出檔案。點選 檢視 來檢視輸出檔案的內容。選取 將輸出附加至步驟歷程記錄中 核取方塊讓作業輸出附加在作業歷程記錄表項目中。您也可以指定執行 T-SQL 的使用者。

圖31-3　填寫後的「新增作業步驟」對話方塊「一般」頁籤

圖31-4　「新增作業步驟」對話方塊中填寫後的「進階」頁籤

- 在已有的步驟前插入一個需要執行的新步驟，選取需要插入新步驟的現有步驟，然後點選 插入 顯示 新增作業步驟 對話方塊，輸入您要插入的步驟資訊。要刪除步驟，選取步驟後點選 刪除 ；要編輯步驟，選取步驟後點選 編輯 。您也可以移動清單中的步驟，選取步驟後點選 移動步驟 右邊的上下箭頭。 起始步驟 下拉式選單允許您選擇作業中哪個步驟要先執行。要先執行的步驟 ID 號碼旁會出現一個綠色的標記。點選 套用 將步驟應用在作業中。如果在多重步驟之間有任何流程邏輯會導致一個步驟無法執行的話，SQL Serve 會在您點選 套用 時顯示警示訊息，並且允許您修改流程邏輯。
- 要為一個作業建立排程，點選 排程 頁籤。要找出伺服器的目前時間，就要在 注意：目標伺服器目前日期時間 下拉式選單中選取伺服器名稱。現在點選 新的排程 來顯示 新增作業排程 對話方塊，如圖31-5所示。排程將指定何時何日該執行作業，可在某一時刻執行也可以定期執行。如果您想在任意時刻用手動執行作業，那就不需要作業排程-您可以在想要執行作業時執行。填入排程名稱 MyDB_backup_schedule，並在 排程類型 區域中設定選項（在這裡要選擇 重複執行 ），然後選取 啟用 核取方塊，如圖31-5所示。 啟用 核取方塊在這裡的功能和它在 新增作業屬性 視窗中的功能一樣。
- 由於我們選擇重複排程類型，您必須設定作業要在何時何日執行。要這樣做的話，就點選 變更 顯示 編輯重複執行作業排程 對話方塊。鍵入新時間和日期，點選 確定 回到 新的排程 對話方塊。（記住我們要在每晚 11 點設定一個每日備份。）
- 在 新的排程 對話方塊中點選 確定 以接受您的排程，並回到 新作業屬性 視窗。要刪除排程，就選取排程名稱並點選 刪除 ；要編輯排程， 就選取排程名稱並點選 編輯 。

圖31-5　新的排程對話方塊

說明

您也可以替這個作業建立新警示。本章稍後將提到警示的更多細節。

- 點選 告知訊息 頁籤，如圖31-6所示。在這個頁籤上，您可以設定一個通知程序，那麼操作員（或指定使用者）在作業成功、失敗、或完成時會收到通知。通知可以透過電子郵件、呼叫器、或用 NET SEND 指令當成訊息透過網路傳送。您可以將作業狀態寫入 Windows NT 或 Windows 2000 事件紀錄中，甚至可以在作業成功、失敗或完成後自動刪除作業。若要設定操作員通知，就依需要選擇 電子郵件操作員 、 傳呼操作員 、和 網路傳送操作員 核取方塊，然後在右邊下拉式選單上選取操作員名稱。（見本章後面 < 操作員 > 一節來學會如何建立操作員。）在最左邊的下拉式選單中選取執行通知的條件。作業完成要將結果寫入事件紀錄或自動刪除作業的時候，請選擇適當的核取方塊，然後在相關的下拉式選單上選取執行動作的條件。在這個例子中， 要選取 寫入Windows應用程式事件記錄檔 核取方塊。

圖31-6　新作業屬性視窗的告知訊息頁籤

- 完成設定選項後，點選 套用 來建立您的作業。然後點選 確定 退出 新作業屬性 視窗回到 Enterprise Manager。
- 在 Enterprise Manager 左邊窗格中點選 作業 ，您將在右邊窗格中看到含有 MyDB_backup_job 的清單。

建立新類別 要建立新類別，請在 Enterprise Manager 左邊窗格中開啟一個伺服器，展開 管理 資料夾，在 作業 上點選右鍵，在快顯功能表上點選 所有工作 ， 接著選擇 管理作業類別 。 作業類別 對話方塊出現，如圖31-7所示。您可以在這裡加入一個類別，檢視現有類別和在類別中的作業，並可刪除類別。

使用 T-SQL

T-SQL 命令可用來建立作業、增加步驟、並建立作業排程，這些命令分別是系統預存程序 sp_add_job、sp_add_jobstep 和 sp_add_jobschedule。這些預存程序有多個選擇性參數，如下面的程式碼所示。SQL Server 對每個未指定的參數會分配一個預設值。用 Enterprise Manager 建立作業比較簡單，因為它的圖形化使用者介面會引導您設定作業選項，避免您漏掉一些參數。使用 T-SQL 您必須包含所有選擇性參數的值，或確定任何您忽略的預設參數值能夠滿足作業需要。您應該用 Enterprise Manager 代替用手動來執行預存程序。您可以產生 T-SQL 指令檔，讓 Enterprise Manager 用指令檔建立作業，在作業名稱上點選右鍵，在快顯功能表中選取 所有工作 ，接著選擇 產生SQL指令碼 。如果需要的話，這個技術允許您用指令檔重新建立作業。

圖31-7　作業類別對話方塊

要執行剛才所提的預存程序，您必須使用 msdb 資料庫，因為這是儲存程序的地方。如果要使用這些程序，要先看看預存程序中哪些參數是可用的。本章中所有的預存程序都使用同樣的一般語法。預存程序 sp_add_job 的語法如下：

    sp_add_job [ @job_name = ] 'job_name'
    [ , [ @enabled = ] enabled ]
    [ , [ @description = ] 'description' ]
    [ , [ @start_step_id = ] step_id ]
    [ , [ @category_name = ] 'category' ]
    [ , [ @category_id = ] category_id ]
    [ , [ @owner_login_name = ] 'login' ]
    [ , [ @notify_level_eventlog = ] eventlog_level ]
    [ , [ @notify_level_email = ] email_level ]
    [ , [ @notify_level_netsend = ] netsend_level ]
    [ , [ @notify_level_page = ] page_level ]
    [ , [ @notify_email_operator_name = ] 'email_name' ]
    [ , [ @notify_netsend_operator_name = ] 'netsend_name' ]
    [ , [ @notify_page_operator_name = ] 'page_name' ]
    [ , [ @delete_level = ] delete_level ]
    [ , [ @originating_server = ] 'server_name' ]
    [ , [ @job_id = ] job_id OUTPUT ]

sp_add_jobstep 的語法如下：

    sp_add_jobstep [ @job_id = ] job_id | [ @job_name = ] 'job_name'
    [ , [ @step_id = ] step_id ]
    { , [ @step_name = ] 'step_name' }
    [ , [ @subsystem = ] 'subsystem' ]
    [ , [ @command = ] 'command' ]
    [ , [ @additional_parameters = ] 'parameters' ]
    [ , [ @cmdexec_success_code = ] code ]
    [ , [ @on_success_action = ] success_action ]
    [ , [ @on_success_step_id = ] success_step_id ]
    [ , [ @on_fail_action = ] fail_action ]
    [ , [ @on_fail_step_id = ] fail_step_id ]
    [ , [ @server = ] 'server' ]
    [ , [ @database_name = ] 'database' ]
    [ , [ @database_user_name = ] 'user' ]
    [ , [ @retry_attempts = ] retry_attempts ]
    [ , [ @retry_interval = ] retry_interval ]
    [ , [ @os_run_priority = ] run_priority ]
    [ , [ @output_file_name = ] 'file_name' ]
    [ , [ @flags = ] flags ]

sp_add_jobschedule 的語法如下：

    sp_add_jobschedule [ @job_id = ] job_id,| [ @job_name = ] 'job_name',
    [ @name = ] 'name'
    [ , [ @enabled = ] enabled ]
    [ , [ @freq_type = ] freq_type ]
    [ , [ @freq_interval = ] freq_interval ]
    [ , [ @freq_subday_type = ] freq_subday_type ]
    [ , [ @freq_subday_interval = ] freq_subday_interval ]
    [ , [ @freq_relative_interval = ] freq_relative_interval ]
    [ , [ @freq_recurrence_factor = ] freq_recurrence_factor ]
    [ , [ @active_start_date = ] active_start_date ]
    [ , [ @active_end_date = ] active_end_date ]
    [ , [ @active_start_time = ] active_start_time ]
    [ , [ @active_end_time = ] active_end_time ]

相關資訊

有關每個參數和它的預設值說明，請參閱< 線上叢書 >索引中相關的預存程序名稱。

說明

這裡所提的預存程序，就像其他與建立和管理作業相關的預存程序一樣，操作員、通知和警示都存在 msdb 資料庫中。您必須使用這個資料庫來執行預存程序。

使用建立作業精靈

Enterprise Manager 提供了一個精靈，這個精靈會一步一步引導您進行作業建立過程，唯一的限制是它限制您只能建立單一步驟的作業。然而，它允許您提供一個作業排程，並指定被通知作業狀態的操作員。建立作業後，您可以用 Enterprise Manager 修改作業，增加更多作業步驟。

依下列步驟，用 建立作業精靈 來建立作業：

1. 從 Enterprise Manager 的 工具 下拉式選單中選擇 精靈 ，在 選擇精靈 對話方塊中打開 管理 資料夾，並選取 建立作業精靈 ，顯示 建立作業精靈 歡迎畫面，如圖31-8所示。
2. 點選 下一步 顯示 選擇作業命令類型 畫面，如圖31-9所示。這個畫面可以指定您要建立作業的步驟類型。在這個例子中，要選取 Transact-SQL 命令 。

   圖31-8　「建立作業精靈」歡迎畫面

圖31-9　「選擇作業命令類型」畫面

- 點選 下一步 ，顯示 輸入Transact-SQL陳述式 畫面（圖31-10）。您必須選擇執行指令的資料庫，然後為作業鍵入陳述式，或者按一下 開啟舊檔 來尋找或開啟含有 T-SQL 命令的檔案。按一下 剖析 ，檢查您輸入的 T-SQl 陳述式的語法。如果您已經選擇 作業系統Shell命令 或者 Active Script 作為指令類型，您就必須為這些類型輸入指令。例如，鍵入 T-SQL 指令備份 master 資料庫到事先建立的 backup_master_dev 裝置，如圖31-10所示。

圖31-10 　輸入 Transact-SQL 陳述式畫面

- 按一下 下一步 ，顯示 指定作業排程 畫面，如圖31-11所示。您可以在這裡指定何時執行作業。

現在 選項指定作業將在精靈完成作業時執行。其他的選項一看便知。在這個例子中，選取 重複執行 ，然後選擇 排程 來設定排程。出現 編輯重複執行作業排程 對話方塊，如圖31-12所示。使用這些選項建立需要的資料庫，並按一下 確定 接受設定，回到 指定作業排程 畫面。

圖31-11　指定作業排程畫面

圖31-12　「編輯重複執行作業排程」對話方塊

- 按一下 下一步 ，顯示 作業通知 畫面，如圖31-13所示。在 網路傳送 或 電子郵件 下拉式選單上選取通知作業完成狀態的操作員。您必須已經為顯示在清單上的作業定義好操作員。（圖31-13顯示未定義操作員。）如果要通知尚未定義的操作員，就請完成這個精靈然後新增一個操作員（本章後面
< 操作員 > 一節會說明）。接著可以更改通知操作員的作業屬性。您也可以取消精靈、建立操作員、然後重新啟動精靈。

圖31-13　「作業通知」畫面

- 按一下 下一步 ，顯示 完成建立作業精靈 畫面，如圖31-14所示。在這裡的 作業名稱 文字方塊中為作業分配一個名稱來取代預設值。在本例中，我們的作業命名為 Backup_master_job。檢查 描述 方塊中的內容，確定顯示出您要的選項，並按一下 完成 來建立作業。如果您要的選項沒出現，按一下 上一步 做些修正。如果作業成功建立起來的話，將會出現一個訊息方塊。按一下 確定 關閉這個訊息方塊。

完成 建立作業精靈 之後，Enterprise Manager 的 作業 資料夾將出現新作業。

圖31-14　完成建立作業精靈畫面

管理作業

您可以透過 Enterprise Manager 或使用 T-SQL 來管理或編輯作業。對您來說Enterprise Manager 可能比較容易使用，因為您不必擔心 T-SQL 預存程序的語法和預設值，而且 Enterprise Manager 的 GUI 會引導您設定作業屬性。

使用 Enterprise Manager

您可以用 Enterprise Manager 以手動方式為作業啟動、停止、停用、啟用、編輯、以及建立T-SQL程式碼。這些任務的每個用法說明如下：

- 要開始作業，在Enterprise Manager右邊窗格的作業名稱上按一下右鍵，並在快顯功能表中選擇 啟動作業 。
- 要停止正在執行的作業，並刪除設定好的重試步驟，在作業名稱上按一下右鍵，並在快顯功能表中選擇 停止作業 。
- 停用作業，讓作業在不允許執行的排程時間內可以測試。在作業名稱上按一下右鍵，並從快顯功能表中選取 停用作業 。選擇 啟用作業 可以再度啟用作業。
- 要編輯作業、排程、或其他的作業屬性，在作業名稱上按一下右鍵，並從快顯功能表中選取 內容 ，顯示作業的 屬性 視窗，視窗中包含了用來建立作業的4個相同頁籤。做好修改之後，按一下 套用 ，然後按 確定 。
- 如果要在不重新輸入陳述式的情況下隨時重建作業，就要替作業建立一個T-SQL 指令碼，在作業名稱上按一下右鍵，在快顯功能表中選取 所有工作 ，然後選擇 產生SQL指令碼 ，顯示 產生SQL指令碼 對話方塊。鍵入檔案名稱，選擇檔案格式（Unicode、ANSI 或者 OEM 文字），按一下 確定 。

使用 T-SQL

您也可以用下面的 T-SQL 預存程序來開始、停止、啟動、停用和編輯一個作業。執行這些程序時，記得使用 msdb 資料庫。

- sp_start_job 立即開始指定的作業。這個程序需要作業名稱或是作業 ID編號。
- sp_stop_job 停止正在執行的作業。這個程序需要作業名稱、作業 ID、或者主機伺服器名稱。
- sp_update_job 允許您啟用、停用、並改變作業的屬性。這個程序需要作業名稱或是作業 ID編號。

  相關資訊

  要檢視這些可以一起使用的預存程序和選項的語法，請參閱< 線上叢書 >並索引「指定預存程序」。

  檢視作業歷程記錄

  SQL Server 在 msdb 系統資料庫的 sysjobhistory 資料表中維護作業執行資訊的歷程紀錄。您可以用 Enterprise Manager 或 T-SQL 來檢視作業歷程記錄資訊。

  使用 Enterprise Manager

  跟著下面步驟用 Enterprise Manager 來檢視作業歷程記錄：

  1. 在 Enterprise Manager 右邊窗格的作業名稱上點選右鍵，從快顯功能表上 選取 檢視作業歷程記錄 ，顯示 作業歷程記錄 對話方塊，如圖31-15所示。在這裡您將看到一行描述每個作業執行的資訊、操作員的通知、以及在SQLServer 上接收到的錯誤或訊息。

     圖31-15　作業歷程記錄對話方塊

  2. 要檢視作業執行狀態的其他細節，請在對話方塊的右上角選擇 顯示步驟詳細資訊 核取方塊。圖31-16顯示 MyDB 備份的細節。

     圖31-16　顯示在 作業歷程記錄 對話方塊中的詳細步驟

  3. 要清除所有訊息，請點選 全部清除 。要更新畫面來檢視作業狀態（開啟 作業歷程記錄 對話方塊後所執行的新作業），請點選 重新整理 。要關閉 作業歷程記錄 對話方塊，請點選 關閉 。

  使用 T-SQL

  使用 T-SQL 檢視關於作業排程的作業歷程記錄資訊，在 msdb 資料庫執行預存程序 sp_help_jobhistory。語法如下：

      sp_help_jobhistory [ [ @job_id = ] job_id ]
      [ , [ @job_name = ] 'job_name' ]
      [ , [ @step_id = ] step_id ]
      [ , [ @sql_message_id = ] sql_message_id ]
      [ , [ @sql_severity = ] sql_severity ]
      [ , [ @start_run_date = ] start_run_date ]
      [ , [ @end_run_date = ] end_run_date ]
      [ , [ @start_run_time = ] start_run_time ]
      [ , [ @end_run_time = ] end_run_time ]
      [ , [ @minimum_run_duration = ] minimum_run_duration ]
      [ , [ @run_status = ] run_status ]
      [ , [ @minimum_retries = ] minimum_retries ]
      [ , [ @oldest_first = ] oldest_first ]
      [ , [ @server = ] 'server' ]
      [ , [ @mode = ] 'mode' ]

  如果您沒有用參數或是沒有使用 job id 或 job name 參數來執行程序的話，關於所有作業排程的資訊將被退回。mode 參數指定是否要退回所有歷史資訊（FULL）或是退回一個摘要（SUMMARY）。預設值設定為 SUMMARY。

  相關資訊

  關於預存程序其他選項的細節，請查閱< 線上叢書 >並索引 sp_help_jobhistory。

  警示

  警示 （alert）是發生在伺服器上，對於事件或是執行狀況的一個回應動作。警示可以通知操作員，使得指定的作業能夠執行，並將事件轉交到另一個伺服器上。 事件 （event）是一個錯誤或訊息，它被寫入 Windows NT 或 Windows 2000 應用程式事件記錄中（您可以用 Windows NT 或 Windows 2000 Event Viewer 來檢視）。 效能條件 （performance condition）是系統效能的特色，可以用 Windows NT 效能監視器或 Windows 2000 系統監視器來監視，如 CPU 公用程式或被 SQL Server 使用的多個鎖定。在本章中，我們將著重在 Windows 2000 的系統監視器上，縱使 Windows NT 效能監視器的用法也很相近。

  事件發生時，SQLServer 代理程式將比較事件與您所定義的警示清單，如果警示已被事件所定義的話，那警示就會啟動。當所定義的效能門檻達到系統監視器中指定的 SQL Server 物件，就會引發效能條件的警示，就像在系統監視器物件 General Statistics 之下的計數器 User Connections。例如，您可以設定當計數器的值達到 50 時發生警示。（

  第 36 章 中有系統監視器的說明。）

  說明

  為了讓您的警示能夠運作，必須執行 SQLServer 代理程式服務。

  事件訊息紀錄

  在說明如何為事件建立警示之前，我們先回顧一下讓訊息傳送到 Windows NT或 Windows 2000 應用程式事件記錄的事件類型；只有這些事件可以用來設定警示。事件（或錯誤）重要層級從 19 到 25 是自動回報到 Windows NT 或 Windows 2000 應用程式事件記錄中的，因此可以啟動警示。預設值中事件重要層級少於 19 的都沒有紀錄，所以警示就不能用這些事件啟動。要使那些事件能夠記錄並且可以啟動的話，您必須使用 sp_altermessage、RAISERROR WITH LOG 陳述式，或者 xp_logevent 來改變事件或訊息的紀錄狀態。本節中，您將學到如何建立使用者定義的事件訊息，並學會如何發出警示訊息以確保事件將寫入應用程式事件記錄中。

  說明

  當 SQL Server 訊息紀錄在 Windows NT 或 Windows 2000 應用程式事件記錄時，它同時也記錄在 SQL Server 記錄中了。要在 Enterprise Manager 中檢視 SQL Server 記錄，請展開 管理 資料夾，然後展開 SQL Server記錄檔 資料夾。

  建立使用者定義事件訊息

  系統所有的資訊和使用者定義訊息都儲存在 master 資料庫的 sysmessages 資料表中。要建立使用者定義訊息，請用 T-SQL 系統 sp_addmessage 預存程序，語法如下：

      sp_addmessage [ @msgnum = ] msg_id ,
      [ @severity = ] severity ,
      [ @msgtext = ] 'msg'
      [ , [ @lang = ] 'language' ]
      [ , [ @with_log = ] 'with_log' ]
      [ , [ @replace = ] 'replace' ]

  使用者定義訊息必須有一個訊息 ID 值（msg_id）為 50001 或者更大的值。Severity 參數是錯誤的重要層級，範圍從 1 到 25，越高的數字表示越高錯誤的重要層級。只有系統管理員可以將重要層級設定成 19 到 25。msg_text 參數是錯誤訊息的內容，當錯誤發生時會顯示在應用程式事件記錄中。language 參數指定訊息使用哪種語言寫入，因為 SQL Server 可以安裝多種語言。with_log 參數可設定成 TRUE 或 FALSE，指定訊息是否要記錄在 Windows NT 或 Windows 2000 應用程式事件記錄中。預設值為 FALSE，這樣在使用 RAISERROR WITH LOG（在下一節說明）時會覆寫這個設定值。Replace 參數指定新訊息應該取代現存有相同訊息 ID 編號的訊息。

  Public 角色成員可允許執行 sp_addmessage，但是要建立訊息重要層級為 18 以上或將 with_log 設定成 TRUE 的話，您就必須是 sysadmin 角色成員之一。

  我們來看看一個使用 sp_addmessage 的例子。下面的陳述式建立一個記錄在事件記錄當中的新訊息（因為 with_log 被設定成 TRUE）：

      sp_addmessage 50001, 16,"Customer ID is out of range.", @with_log="TRUE"
      GO

  事件訊息的警示記錄設定

  假設一個現有的訊息或是您剛建立的訊息不允許記錄（或者您沒有包含 with_log 參數），就像下面的例子：

      sp_addmessage 50001, 16,"Customer ID is out of range.", @with_log="TRUE"
      GO

  如果您稍後要記錄訊息的話，就必須改變訊息的紀錄狀態。這樣的話，請使用sp_altermessage 設定記錄，如下面的例子：

      sp_altermessage 50001, WITH_LOG, "TRUE"
      GO

  另一種方法，您可以在 WITH LOG 選項中使用 RAISERROR 敘述，將訊息回傳到應用程式，並回傳到應用程式事件記錄以及 SQL Server 記錄中。例如，下面敘述用重要層級為 16、狀態值為 1 來傳送訊息 50001，狀態（state）是當錯誤發生在編碼中不止一個地方的時候，用來追蹤的數字：

      RAISERROR (50001, 16, 1) WITH LOG
      GO

  相關資訊

  有關使用 RAISERROR 的更多細節，請參閱< 線上叢書 >索引中的RAISERROR，在 找到的主題 對話方塊中選擇 使用 RAISERROR 。

  要改變訊息的記錄狀態，您可以使用在 master 資料庫中的延伸預存程序xp_logevent。使用這個程序時，訊息將被傳送到事件記錄和 SQL Server 記錄中，但不會傳送到用戶端的應用程式中。下面是使用這個程序的例子：

      USE master
      GO
      xp_logevent 50002, "Customer ID is out of range.", warning
      GO

  要有前兩個參數，並且必須含有使用者定義訊息 ID 編號（一定要大於 50000）和出現在輸出紀錄的訊息文字。第三個參數-重要層級-是選擇性的，可以是 informational、warning 或 error 三個字串之一。重要層級的設定決定了在 Event Viewer 中，訊息之後要出現什麼類型的圖像，這樣才能夠很快地識別出警告或者錯誤。在 Windows 2000 中，資訊的訊息有一個藍色的 i 圖像，警告訊息有一個黃色的 ! 圖像，而錯誤訊息有一個紅色的 X 圖像。如果沒有指定重要層級，預設值為 informational。

  建立警示

  現在我們準備在事件和效能條件上建立警示。要建立警示，您可以使用 Enterprise Manager、T-SQL 或 SQL-DMO。我們將只說明 Enterprise Manager 和 T-SQL 方法，因為 SQL-DMO 超出本書範圍。

  使用 Enterprise Manager 建立事件警示

  在這個例子中，我們將在重要層級為 24 的系統訊息上建立一個警示。訊息在事件記錄中以預設值紀錄，使用者不需要介入變更它的記錄狀態。請跟著下面步驟建立事件警示：

  1. 在 Enterprise Manager 的左邊窗格中展開一個伺服器資料夾，展開 管理 資料夾，展開 SQL Server代理程式 資料夾。在 警示 上按一下右鍵，並在快顯功能表上選取 新增警示 ，出現 新增警示屬性 視窗，如圖31-17所示。在 一般 頁籤上鍵入警示的名稱（可輸入128個字元）。在這個例子中鍵入『IO_error_alert』。 啟用 核取方塊允許您啟用或停用這個警示。停用警示將導致它不被引發，就像停用作業一樣。本例中，要確定警示可啟用。在 型別 下拉式選單中選擇 SQL Server事件警示 ，因為我們要建立警示，而這個警示在某個事件發生時會被解除。（另一種警示類型選項是S QL Server 效能條件警示，這種警示類型的例子將在下一節說明。）我們的例子是要建立當 I/O 錯誤發生時會解除的警示。

     圖31-17　「新增警示屬性」視窗的「一般」頁籤

  2. 在 新增警示屬性 視窗的 事件警示定義 區域中，選擇 錯誤號碼 或 重要性 指定您要啟動警示的事件，然後指定一個錯誤編號或是重要層級。如果重要層級指定好了，那個重要層級的所有錯誤都將引發警示。在本例中，要選取 錯誤號碼 ，然後點選 ... 按鈕來尋找編號。出現 管理SQL Server訊息 對話方塊，如圖31-18所示。
  3. 要搜尋指定的錯誤，請在 搜尋 頁籤中的 重要性 清單上選取一個類別，然後按一下 尋找 。找到的錯誤訊息將列在 訊息 頁籤上。 搜尋 頁籤的底部有兩個核取方塊，可以用來限制搜尋。 只包含記錄的訊息 核取方塊可以讓搜尋來檢索自動記錄在事件記錄中的訊息。 只包含使用者自訂的訊息 核取方塊限制只能搜尋使用者定義的訊息。例如，要尋找所有嚴重的硬體錯誤，要選取在 重要性 清單方塊中的 024-嚴重錯誤 ： 硬體錯誤 ，然後按一下Find。錯誤編號823（重要層級為24）將出現在 訊息 頁籤上，如圖31-19所示。

     圖31-18　「管理SQL Server訊息」對話方塊的「搜尋」頁籤

     圖31-19　「管理SQL Server訊息」對話方塊的「訊息」頁籤

  4. 按一下 確定 接受這個訊息，並回到 新增警示屬性 視窗的 一般 頁籤。 資料庫名稱 下拉式選單讓您指定只有當事件來自選取的資料庫中，警示才會引發。保持 所有資料庫 的預設值設定。 錯誤訊息中所含的文字 文字方塊允許您鍵入字串（可到 100 個位元），來限制將引發警示的錯誤，而這些錯誤文字將顯示那些剛鍵入的字串。如果讓這個文字方塊空著的話，就不會受到任何限制。
  5. 按一下 回應 頁籤，如圖31-20所示。這個頁籤中，您可以指定警示發生時應該採取什麼行動。選取 執行作業 核取方塊，在下拉式選單上選取一個作業名稱，讓作業可以在警示發生時執行。按一下 新增操作員 ，建立一個新操作員來通知。現有的操作員會出現在 通知操作員 清單上。您可以指定操作員是否應該用電子郵件、呼叫器、網路傳送、或是綜合上述方法來通知。

     圖31-20　「新增警示屬性」視窗的「回應」頁籤

     如果指定用電子郵件通知操作員，而且也選取了 將警示的錯誤文字包含於 核取方塊，錯誤文字將在警示訊息中傳送給操作員。在電子郵件中將附加的文字鍵入到頁籤底部的 待傳送的其他告知訊息 文字方塊。附加文字最多可有 512 位元。圖31-20顯示操作員 TestOperator，選擇用電子郵件通知。附加的訊息包含在內。注意 回應間隔延遲 文字方塊。這些文字方塊設定指定警示重複發生時，操作員將多久被通知一次。設定 60 分鐘表示操作員每 60 分鐘被通知一次。

  6. 要接受您輸入的的警示和回應，請按一下 套用 。然後點選 確定 來關閉視窗。

  使用 Enterprise Manager 建立效能條件警示

  當某種效能條件發生時，我們可使用 Enterprise Manager 建立效能條件警示。注意，SQLServer 代理程式每 20 分鐘輪詢一次效能計數器，所以如果在輪詢之間有幾秒鐘的高低情況發生，是監測不到的。跟著下面步驟建立警示：

  1. 在 Enterprise Manager 的左邊窗格中展開一個伺服器資料夾，展開 管理 資料夾，展開 SQL Server代理程式 資料夾。在 警示 上按一下右鍵，並在快顯功能表上選取 新增警示 ，出現 新增警示屬性 視窗（圖31-21）。在 一般 頁籤的 名稱 文字方塊中為警示鍵入一個名稱（本例中使用的名稱是user_alert）。指定一個效能條件警示，選取 型別 下拉式選單中的 SQL Server效能條件警示 。
  2. 在 效能條件警示定義 區域，定義一個將啟動警示的效能條件。選取您要使用的 SQL Server 效能物件，作為 物件 下拉式選單中的啟動物件，然後選取要在 計數器 下拉式選單中使用的計數器。設定 發出警示的時機為計數器達 選項，指定在哪種情況下警示會被引發。最後設定一個門檻，如果超過這個特定值，就會引發警示。圖31-21顯示當 SQL Server User Connections 計數器到達100時，這個設定就會引發警示。
  3. 要完成警示的設定，就在 回應 頁籤上設定選項，如前面步驟5所述。 按一下 套用 然後按 確定 。

     圖31-21　「新增警示屬性」視窗的「一般」頁籤

  使用 T-SQL 建立事件警示或效能條件警示

  您也可以使用 T-SQL 來建立警示，但是要記得如果用 Enterprise Manager 建立警示，您可以為那些警示產生 T-SQL 指令碼。（要這樣做的話，請在 SQL Server代理程式 資料夾中的 警示 上按一下右鍵，在快顯功能表上點選 所有工作 ，然後選擇 產生SQL指令碼 。）您可能會發現用 Enterprise Manager 建立警示比較容易，因為 T-SQL 方法需要學習並記住很多選項參數以及它們的預設值。

  要用 T-SQL 增加警示，請使用 sp_add_alert 預存程序。不管要建立事件警示或是效能條件警示，都要使用這個程序。參數選項決定警示要建立成何種類型。sp_add_alert 的語法如下：

      sp_add_alert [ @name = ] 'name'
      [ , [ @message_id = ] message_id ]
      [ , [ @severity = ] severity ]
      [ , [ @enabled = ] enabled ]
      [ , [ @delay_between_responses = ] delay_between_responses ]
      [ , [ @notification_message = ] 'notification_message' ]
      [ , [ @include_event_description_in = ] include_event_description_in ]
      [ , [ @database_name = ] 'database' ]
      [ , [ @event_description_keyword = ] 'event_description_keyword_pattern']
      [ , { [ @job_id = ] job_id | [ @job_name = ] 'job_name' } ]
      [ , [ @raise_snmp_trap = ] raise_snmp_trap ]
      [ , [ @performance_condition = ] 'performance_condition' ]
      [ , [ @category_name = ] 'category' ]

  預存程序用來修改警示、檢視警示資訊，並分別刪除 sp_update_alert、sp_help_alert 和 sp_delete_alert 的警示。記住，所有的預存程序都可在 msdb 資料庫中找到。

  相關資訊

  關於本節所提的程序細節，請參閱< 線上叢書 >並索引 < 預存程序 >。

  操作員

  操作員 （operators）是可以在作業完成或警示發生時，從 SQL Server 接收通知的個人。操作員是一個人，負責維護執行 SQL Server 的系統。您已經學會如何定義傳送給操作員的通知訊息。正如前面所提，用來與操作員聯繫的方法有三種：傳送電子郵件訊息、呼叫、和使用網路傳送指令（傳送網路訊息到操作員的電腦中）。系統必須符合好幾個必要條件才能才能讓這些方法順利運作。使用電子郵件和呼叫聯繫的話，必須在伺服器上安裝 MAPI-1-compliant e-mail client（MAPI表示 Messaging API），如 Outlook 或是 Exchange Client，而且必須為 SQLServer 代理程式建立一個郵件檔案夾。使用呼叫，還需要在郵件伺服器上安裝三方的 e-mail-to-pager 軟體來處理內部的電子郵件訊息，並且將訊息轉換成呼叫訊息。使用網路傳送，必須以 Windows NT 或 Windows 2000 為作業系統-網路傳送不支援 Windows 95/98。

  相關資訊

  關於如何設立郵件資料夾，請參閱您的 email 用戶軟體文件。有關 pager-to-e-mail 軟體的詳細資訊，請參閱您的呼叫服務提供員或呼叫文件資料。

  在 SQL Server 上必須定義每個操作員。您可以建立不只一個操作員來分擔責任，在聯絡不上其他操作員時，就通知故障安全防護操作員（例如在呼叫失敗時）。您可以使用 Enterprise Manager、T-SQL 和 SQL-DMO 來建立操作員。本節將說明 Enterprise Manager 和 T-SQL 的方法，SQL-DMO 則不在本書討論範圍之內。

  使用 Enterprise Manager 建立操作員

  跟著下列步驟用 Enterprise Manager 建立操作員:

  1. 在 Enterprise Manager 的左邊窗格中展開一個伺服器資料夾，展開 管理 資料夾，展開 SQL Server代理程式 資料夾。在 操作員 上按一下右鍵，並從快顯功能表上選取 新增操作員 ，顯示 新增操作員屬性 視窗，如圖31-22所示。在 一般 頁籤中為新操作員鍵入名稱，然後輸入一個或多個：操作員的電子郵件名稱、呼叫器的電子郵件名稱、以及網路傳送位址。

     如果輸入呼叫位址，您可以指定在 傳呼待命排程 區域中何時可以呼叫操作員。例如，如果有不只一位操作員，您可以分配責任，讓一個操作員在星期一、三、五、和星期日被呼叫，而另一個操作員在星期二、四、和星期六被呼叫。

  2. 按一下 告知訊息 頁籤。如果點選 警示 （在標頁籤的右上角），會顯示存在的警示清單，如圖31-23所示。在欄位中選擇核取方塊，您可以指定何種警示將通知操作員，以及將用何種聯絡方法通知操作員。

     圖31-22　「新增操作員屬性」視窗的「一般」頁籤

     圖31-23　「新增操作員屬性」視窗的「一般」頁籤出現「警示」

  3. 建立新操作員時，您將無法點選 作業 ，因為沒有作業要通知新的操作員，而且新的操作員也還不存在。要避免新的操作員接收通知，請清除 操作員已準備接收告知訊息 核取方塊。停用這個選項使您暫停傳送通知給操作員-例如，在操作員度假時。然後當操作員回來時，您可以撤銷核取方塊再啟用通知。
  4. 按一下 傳送電子郵件 按鈕，建立列在 一般 頁籤上用來傳給操作員的文字訊息。（如果沒有輸入電子郵件位址的話，將出現錯誤。）您可以傳送電子郵件，描述為操作員建立的通知類型。在 告知訊息 頁籤底部，將看到關於最近鍵入、用來通知操作員的資訊。

  使用 T-SQL 建立操作員

  T-SQL 指令用來建立操作員、修改操作員資訊、檢視操作員資訊、以及刪除操作員。在 msdb 資料庫中系統的預存程序分別有：sp_add_operator、sp_update_operator、sp_help_operator 和 sp_delete_operator。您可能會再度覺得使用 Enterprise Manager 是比較容易的方法。用 Enterprise Manager 建立操作員後，可以產生 TSQL 指令碼。

  這裡是 sp_add_operator 的語法：

      sp_add_operator [ @name = ] 'name'
      [ , [ @enabled = ] enabled ]
      [ , [ @email_address = ] 'email_address' ]
      [ , [ @pager_address = ] 'pager_address' ]
      [ , [ @weekday_pager_start_time = ] weekday_pager_start_time ]
      [ , [ @weekday_pager_end_time = ] weekday_pager_end_time ]
      [ , [ @saturday_pager_start_time = ] saturday_pager_start_time ]
      [ , [ @saturday_pager_end_time = ] saturday_pager_end_time ]
      [ , [ @sunday_pager_start_time = ] sunday_pager_start_time ]
      [ , [ @sunday_pager_end_time = ] sunday_pager_end_time ]
      [ , [ @pager_days = ] pager_days ]
      [ , [ @netsend_address = ] 'netsend_address' ]
      [ , [ @category_name = ] 'category' ]

  相關資訊

  列在本節中關於預存程序選項的細節，請參閱< 線上叢書 >索引中 < 預存程序 >的部分。

  SQLServer 代理程式錯誤記錄檔

  SQLServer 代理程式服務本身擁有錯誤記錄，記錄了 SQLServer 代理程式的啟動與關閉，以及任何跟S QLServer 代理程式作業或警示相關的警告、錯誤和通知訊息。要使用 SQLServer 代理程式錯誤記錄檔，請跟著這些步驟進行：

  1. 在 Enterprise Manager 的左邊窗格中展開一個伺服器資料夾，展開 管理 資料夾，展開 SQL Server代理程式 資料夾上按一下右鍵，並從快顯功能表上選取 顯示錯誤記錄檔 ，出現錯誤記錄，如圖31-24所示。
  2. 型別 下拉式選單讓您檢視錯誤訊息、警告訊息、資訊訊息或者全部的訊息（所有類型）。圖31-25顯示在開啟 SQLServer 代理程式之後，錯誤訊息看起來像什麼。（注意， 所有類型 是在 型別 下拉式選單中選取的。）

     圖31-24　「SQL Server代理程式錯誤記錄」對話方塊

     圖31-25　「SQL Server代理程式錯誤記錄」對話方塊，顯示所有訊息的類型

  3. 每次開啟 SQLServer 代理程式時，錯誤訊息將重新啟動，覆寫記錄中的現有訊息。您可以搜尋含有特定字串的訊息，只要在 內含的文字 文字方塊中鍵入字串，然後按Enter或者點選 套用篩選條件 。圖31-26顯示搜尋字串 CPU 之後的錯誤記錄。

     圖31-26　錯誤紀錄訊息中搜尋字串的結果

  4. 在訊息上按兩下，檢視 SQL Server 代理程式 Error Log Message 對話方塊，如圖31-27所示。

     圖31-27　「SQL Server代理程式錯誤紀錄訊息」對話方塊

     如果搜尋結果不止一種訊息，您可以用 上一步 和 下一步 按鈕來轉換訊息。如果只找到一個訊息，這些按鈕將無法使用。

     如果操作員因為某種原因或是作業無法執行而聯絡不上的話，SQLServer 代理程式錯誤紀錄將收到一個錯誤訊息。您應該偶爾檢查這個錯誤記錄，確定是否發生任何錯誤需要處理。

  本章總結

  在本章中，您學會了如何使用 SQLServer 代理程式服務，透過定義作業和操作員、設定通知給操作員、以及建立事件警示和效能條件警示來使管理工作自動化。您學會了在建立事件警示時，錯誤重要層級的重要性，以及如何變更錯誤訊息的記錄狀態，以便在 Windows NT 或 Windows 2000 應用程式事件記錄中啟用紀錄。您還學會了如何檢視 SQLServer 代理程式錯誤記錄檔，檔案中記錄了關於 SQLServer 代理程式的資訊，以及發生在警示與作業中的錯誤和警告。在

  第 32 章 中，我們將討論備份 SQL Server 資料庫。