8.5 SQL Server 代理


8.5 SQL Server 代理
本節探討如何使用Microsoft SQL Server代理服務自動化SQL Server任務。SQL Server 代理服務作為依賴於SQL Server服務的Windows服務運行。SQL Server的每一個實例都將
會有自己的代理服務來管理作業、計划、操作員和膂報。您將了解到用於單個和多個服務
器管理配置的代理服務的基本組成部分。
SQL Server代理的主要目標是讓數據庫管理員的工作更輕松。理想情況中,可以配置
服務器並讓它們運行,而從來不用擔心丟失數據或數據庫掉線。但是,這只是理想情況。
而且,因為您不可能每時每刻都盯着每個服務器,所以可以利用SQL Server代理來幫助完 成一些無法完成的工作。
注意:
SQL Server 2008速成版中沒有SQL Server代理服務。
8.5.1 配置SQL Server代理服務
在第2 章中,我們學習了如何安裝SQL Server,以及如何定義SQL Server服務和SQL
Server代理服務將使用的帳戶、通常的配置是為兩種服務使用相同的帳戶,但並不是必須 這么做。實際上,由於特定的作業或管理要求,可能需要對這兩種服務使用完全不同的憑
據。不管是否使用了同樣的帳戶,SQL Server代理必須是sysadmin固定服務器角色的成員, 而且在安裝服務器的Windows操作系統中必須具有如下權限: • 為進程調整內存配額
• 作為操作系統的一部分運行
• 忽略遍歷檢查
• 作為批處理作業登錄
• 作為服務登錄
• 替換進程級標記
這些權限可以由編輯本地安全策略的管理員授予。如果SQL Server代理要和本地系統之 外的服務和功能進行交互,那么需要使用一個活動目錄域帳戶。這樣SQL Server代理就可以 使用一個經過身份驗證的帳戶連接到一個遠程文件系統、Web服務或另一個SQL Seiver。 如果對SQL Server采用默認安裝,則不會后動SQL Server代理服務,而是要求手動控 制該服務的啟動和停止。不要這樣做!如果是為了自動化或膂報功能而使用SQL Server代 理,那么它必須運行。如果停止SQL Server代理,那么所有已計划的作業就都不能運行, 也沒有操作員會收到表明一個作業運行成功或者失敗的通知消息。安裝SQL Server時,域
好把SQL Server代理配置為在Windows啟動時自動運行。
然而,如果沒有把SQL Server代理配置為fl動啟動,那么就需要知道如何手動啟動它。 就啟動和停止SQL Server代理服務而言,實際上可以使用4 種不同的方式。 其中一種就是在Windows命令提示符下使用NET START命令:

NET START SQLSERVERAGENT
要停止此服務,可以使用NET STOP命令:
NET STOP SQLSERVERAGENT
還可以使用“管理工具”或 者 “計算機管理”控制台中的“服務”管理單元。使用這
個工具,可以配置運行該服務的帳戶、更改啟動行為、選擇服務恢復選項,以及查看服務
的依賴關系。在第3 章中,我們學習了如何使用SQL Server配置管理器。同樣,也可以用 它來配置SQL Server代理服務所使用的帳戶、啟動行為,以及錯誤報告選項。最后,可以
使 用 SQL Server Management Studio配 置 SQL Server代理服務的行為和屬性。
本節將深入探討如何配置此服務的各種屬性,使您能夠通過熟悉的工具了解每一個可
配置的元素。在 “對象資源管理器”中,可以右擊“SQL Server代理”節點,然后根據需 要停止或是啟動該服務。要配置此服務,可從上F文菜單中選 擇 “屬性”命令。
1. “常規”屬性
在 “常規”屬性頁(如圖8-17所示)上,可以看到服務的當前狀態,並且可以配置SQL
Server和 SQL Server代理在意外停止時自動重新啟動。還可以更改錯誤日志的位置,並選 擇在日志中包含執行追蹤消息以進行高級査錯。另外還有一個 使 用 OEM(Original
Equipment Manufacturer,原始設備制造商)文件的選項。這樣日志信息就可以以非Unicode
格式存儲數據,從而節省系統上的空間。然而,如果錯誤日志包含任何Unicocie數據,就 可能比較難以讀取或解釋。最后,“Net Send收件人”部分指定了一個操作員,他可以收到
SQL Server寫入日志文件的消息。
注意:
Windows Server 2003和 2008中默認禁用信使服務,所以INET SEND命令可能不可用。

 

2. “高級”屬性
在 “高級”屬性貞(如圖8-18所示)中,可以啟用事件轉發,這 將 把 SQL Server事件 重定向到其他服務器。要配置這個選項,選 中 “將事件轉發到其他服務器”復選框,然
后在下拉列表中選擇一個可用的服務器或實例。配置完成之后,還可以決定轉發什么類
型的事件。“未處理的事件”是沒 有 由 SQL Server代理系統定義薺報的事件,或者可以選 擇 “所有事件”。也可以決定轉發嚴重性最低的事件。嚴重級別值將在本章稍后詳述。
在這個窗口中,也可以定義CPU閑置閾值。如果有作業計划定義了作業(如備份事務
日志),要求在CPU閑置時執行,這就相當有用。在這種情況下,默認值表明必須將CPU
使用率低於10%保 持 10分鍾。必要時可以調整這個值以滿足性能需求。

3. “警報系統”屬性
在 “警報系統”屬性頁(如圖8-19所示)上,可 以首先定義是否啟用SQL Server代理的 郵件服務。如果希望操作員通過電子郵件接收警報通知,則應該啟用這個功能。也可以決
定是否使用數據庫郵件功能或SQLMail功能。注意,SQLMail僅是為了向后兼容而存在, 不應與新的應用程序一起使用,因為它將會被淘汰。如果是從以前版本的SQL升級,那么
應該盡快把應用程序轉換為使用數據庫郵件。 •

一旦選擇了郵件系統(最好是數據庫郵件),就可以選擇一個合適的配置文件。如果使
用 的 是 SQLMail,則 可 以 測 試 MAPI連接性,然 后 允 許 在 Microsoft Outlook配 置文件的“已 發送郵件”文件夾中保存已發送消息。
如果需要尋呼操作員,則可以在消息的“收件人”行、“抄送”行 和 “主題”欄里配
置地址格式的選項,還可以選擇在頁面中包含電子郵件消息的正文。除此之外,可以定義
一個防故障操作員以及通知該操作員的方法。防故障操作員的角色會在本章稍后詳述。
最后,還有一個選項是“為膂報的所有作業響應替換標記”。標記是本章稍后將討論
的作業步驟的一個功能(同變fi相似)。現在只需要明白這個選項為警報系統執行的任何作 業啟用了標記替換,把變量替換為實際值。
4. “作業系統”屬性
在 “作業系統”屬性頁(如圖8-20所示)中可以為作業指定超時值。這個選項配置了在
強制終止作業之前,SQLServei•代理會等待多久讓其自己完成。默 認 值 是 15秒 ,但應該知 道一些特定作業(由於其本身的復雜姓)可能需要的時間或執行的操作類型。

還有一個選項可以將非管理員帳P 配置為作業步驟的代理帳戶。這個選項只有在使用
SQL Server Management Studio管理舊版本的SQL Server及其相應的代理服務時才適用。可
以通過提供用戶名、密碼和域名來指定帳戶的身份驗證信息。8.5.3—節將介紹為SQL Server 2008作業步驟配置代理帳戶的內容。
5. “連接”屬性
如果需要連接到一個使用非標准連接屬性的SQL Server實例,可以輸入一個SQL Server 使用的別名,使代理服務建立和保持•個連接(如圖8-21所示)。也可以指定是否要求SQL
Server代理服務使用Windows身份驗證或SQL Server身份驗證。如果選擇使用SQL Server身
份驗證,必須為屬於sysadmin固定服務器角色的成員的帳戶提供一個有效的登錄名和密碼。

6. “歷史記錄”屬性
最后,“歷史記錄”屬性頁可以為msdb數據庫中的作業日志配置保留設置。默汄情況 下,sysjobhistory表中最多可以存儲1000行,而每個作業AT以使用的不超過100行。可以 使用這個窗U刪除或更改對作業歷史記錄表的人小限制(如圖8-22所示)。

也可以讓SQL Server代理服務自動清除sysjobhistory表中的舊作業歷史記錄行。這一 功能默認禁用。但是如果啟用了它,就可以指定多少天、周或月之前的作業歷史記錄是必
須從數據庫中清除的。如果需要無限期地維護作業歷史記錄,或者需要有更大的控制權來
決定清除哪些作業歷史記錄,可以考慮創建一個自定義作業來滿足需求。
8.5.2 SQL Server代理安全性
在計划使用SQL Server代理服務或允許其他用戶訪問它時,需要確保已授予了合適的 訪問權限。默汄情況下,只有sysadmin固定服務器角色的成員才具有SQL Server代理服務 的完全訪問權限。在 msdb數據庫中,其他角色是用不同級別的權限創建的,但是在向這 些角色顯式添加用戶以前,它們都是空的。本節將介紹這些角色以及指派給它們的權限。
1. SQLAgentUserRole
SQLAgentUserRole是 3 種 SQL Server代理角色中最受限制的角色。作為該角色的成
員的用戶可以創建新的作業和計划,但是只能管理自己創建的作業和計划。而且,他們不
能查看系統中其他作業的屬性,也不能定義操作員或代理。如果他們需要把一個操作員或
代理指派給一個作業步驟,則該操作員或代理必須是已經定義好的。這個角色的成員也不
能刪除作業歷史記錄信息,即使是自己擁有的作業,除非他們被授T* sp_purge_jobhistory 存儲過程的EXECUTE權限。對該角色的另-個重要限制是它不能創建或管理多服務器作
業。這意味着該角色成員創建的任意作業被局限於創建該角色的服務器上。
2. SQLAgentReaderRole
SQLAgentReaderRole可以使用P 創建木地作業和計划,並只管理他們自己所創建的本 地作業和計划。除了這些權限之外,他們也可以杏看其他本地作業和多服務器作業的屬性。
這使得他們可以審核服務器上其他作業的配置,但沒有任何權限可以更改這些設置。這個
角色的成員也不能創建多服務器作業,但是可以査看所有本地和遠程作業的作業歷史記錄。
這個角色的成員也不能刪除他們所擁有的作業的歷史記錄,除非他們獲得了
sp_purge」obhistory 存儲過程的 EXECUTE 權限。
3. SQLAgentOperatorRole
這個角色的成員可以創建本地作業,以及管理和修改他們擁有的作業。他們還可以查
看和刪除所有本地作業的作業歷史記錄信息。在有限的范圍內,他們還可以啟用或禁用其
他用戶的作業和計划。不過,他們仍然不能創建和管理操作員和代理。他們還只限於只讀
訪問多服務器作業。除了 sysadmin固定服務器角色之外,這個角色被授予的針對SQL Server 代理服務中作業系統的權限是最多的。
8 .5 .3 創建作業
作業是SQL Server代理服務的真正核心。它是通過一系列步驟執行的操作,包括運行 Transact-SQL腳本、啟動命令行應用程序、ActiveX腳本任務、復制任務以及其他多種任

務。每個任務被定義為一個單獨的作業步驟。作業系統設計的一部分是建立毎個任務,以
便在作業步驟之間建立依賴關系和工作流。一個很簡單的例子就是一個夜間運行的備份作
業,該作業完成后會通過電子郵件通知管理員。作業的簡單和復雜程度取決於想要它完成
什么任務。有時,由於前面提到的超時設置,您需要創建多項作業,而不是一個單一的、
過於復雜的作業。
試一試 創建一個新作業
首先在SQL Server Management Studio中創建•個新作業。在這個例子中,將只在“常
規”屬性頁上填充有關該作業的最基本的信息。可以在這個練習中自由瀏覽其他屬性頁,
但要知道本章稍后才會介紹那些頁面中的可配置選項。
(1) 在 “對象資源管理器”中,展 開 “SQL Server代理”節點。 (2) 右 擊 “作業”節點,選 擇 “新建作業”命令。
(3) 在 “新建作業”對話框(如圖8-23所示)中,輸入Simple Backup作為作業名。 (4) “所有者”欄保持默汄值。
(5) 在 “類別”下拉列表中選擇“數據庫維護”列表項。
(6) 在 “說明”框中輸入 “Simple Backup Job. Test 1 ”。
(7) 取消選中“已啟用”復選框。
(8) 單 擊 “確定”按鈕。

這就創建了一項新的作業,並且在關閉“新建作業”窗口之后就停止其運行。因為該
作業還沒有步驟,讓其運行不可能有多大的危害,似是還是應該養成這樣的刃慣,直到測
試完作業,確保它們像預期的那樣工作。
現在看一下如何使用T-SQL創建-個新作業。sp_add_job存儲過程允許創建一個新作 業,並設置作業的可配置選項。表 8-7列出了 sp_ add Jo b 的所有選項。

現在可以看一下如何使用sp_addjob存儲過程創建一個僅有 一 些 基 本 元 素的新作業。 在創建了其他諸如計划、操作員和警報等元素之后,將把它們添加到本節所創建的作業中。
在這個例子中,將創建-個新作業,用來進行數據檢索任務。
DECLARE @jobid uniqueidentifier; EXECUTE msdb.dho.sp_add_j ob @job_name = 1 Poor Performers Report’, ^description =*Monthly task to indicate which sales team members have less than remarkable sales figures over previous year *, @job_id =@job—id OUTPUT;
SELECT @job_id
關 於 job_id參數,需要注意它使用imiqueidentifiei•數據類型。這種數據類型也被稱作
全局唯一標識符(Globally Unique Identifier, GUID)。如果作業或計划被用於多服務器作業,
它們都會使用GUID。本章稍后會介紹多服務器作業。
如 果 使 用 sp addjob存儲過程添加一個作業,那么還需要確保可使用sp addjobserver 存儲過程使作業在服務器上運行。如果作業要在本地服務器b運行,就需要通過job_id或 job name定義作業,如下例所示:
EXECUTE msdb.dbo. sp一add_j observer @job一name='Poor Performers Report *;
現 在 SQL Server代理服務已經有兩個新作業可用。它們都沒有定義步驟,所以運行它 們不會有任何結果,只會收到一個失敗消息。在將步驟添加到作業中之前,看一下如何管
理作業類別。
1 . 類別
管 理 作 業 類 別 的 最 簡 單 ,也 是 首 選 的 方 法 是 使 用 SQL Server Management Studio。 雖 然可以直接編輯syscategories表 ,但是不推薦這樣做。可以添加新的類別,並刪除用 戶創建的類別。但要注意,不能刪除內置類別。在這個例+中,將增加一個新的類別,叫
做 AW-Performance Tasks。
試一試 創建一個新類別
⑴ 在 “對象資源管理器”中展幵服務器,然 后 展 開 “SQL Server代理”節點。 (2)右 擊 “作業”節點,選 擇 “管理作業類別”命令。
⑶ 在 “管理作業類別”窗口(如圖8-24所示)中,單 擊 “添加”按鈕。
(4) 輸入 AW-Performance Tasks 作為類別名。
(5) 選 中 “顯示所有作業”復選框。
(6) 選 中 Poor Performers Report作業行中的復選梢。
(7) 單 擊 “確定”按鈕。
(8) 單 擊 “取消”按 鈕 關 閉 “管理作業類別”窗口。

這樣就成功創建了 AW-Performance Tasks類別,並 把 Poor Performers Report作業添加
到了該類別中。現在您創建的任何作業都可以使用此類別。
2 .創建作業步驟
現在已有一些可以使用的作業,需要把一呰簡單的步驟添加到這些作業中。在此之前,
看一下可以定義的各種類型的作業步驟,如 表 8-8所示。

對每-個作業步驟類型來說,如果作業所有者或運行作業的登錄名沒有權限執行該類
型的任務,則可以標識一個或多個代理帳戶來執行這一步驟類型。這可以讓用戶運行那些
包含了在他們自己的憑據下無法運行的步驟的作業。本章稍后將介紹如何創建和管理代理
帳戶。

 

第一個例子使用SQL Server Management Studio編 輯 Simple Backup作業的屬性。您將 添加一個Transact-SQL步驟,將 AdventureWorks2008數據庫完整備份到本地磁盤上。在此
之前,應當在C 盤上創建一個dbBackups文件夾。 (1) 在 “對象資源管理器”中,展開服務器,再展開“SQL Server代理”節點。 (2) 展 開 “作業”節點。
(3) 右 擊 Simple Backup作業,選 擇 “屬性”命令。 (4) 在 “選擇頁”列表下選擇“步驟”頁。
(5) 單 擊 “新建”按鈕。
(6) 在 “步驟名稱”框中,輸入 AdventureWorks2008 Backup。 (7) 在 “類型”下拉列表中,選擇Transact-SQL。
(8) 對 “運行身份”不做改動。
(9) 確保選中master數據庫。
(10) 在命令窗口中輸入如下代碼:
BACKUP DATABASE AdventureWorks2008 TO DISK = 1C :\dbBackups\AWFull.bkf';
(11) 單 擊 “確定”按鈕關閉“新建作業步驟”窗口。
(12) 單 擊 “確定”按鈕關閉“作業屬性”窗口。
(13) 在 SQL Server Management Studio注意中,它提醒最后一步 將 從 “轉到下一步”
改為“成功后退出”。單擊“是”按鈕。
現在已經創建了一個簡單的作業步驟。右擊該作業,在彈出的上下文菜單中選擇“啟
用”命令,就可以啟用該作業。即使作業被禁用,也可以隨時手動運行該作業,方法是右
擊並選擇“啟動作業”命令。該作業應當可以成功執行。
如果冋到作業步驟屬性並查看“髙級”屈性頁,可以注意到有配置作業在這一步驟完
成時如何回應的選項。如果作業成功執行,可以讓它執行如下任務之一:
• 轉到下一步
• 退出報告成功的作業
• 退出報告失敗的作業
• 轉到步驟:(序號)
注意:
轉到某一特定序號的步驟的選項只有在該作業中有多個步驟時才可用。要小心創建循
環作業(其中作業步驟1轉到下一步驟,而作業步驟2返回到作業步驟1).
在這一頁上,也可以指定重試次數,以及服務器在兩次重試之間等待的時間(分鍾)。
如果作業步驟不能成功完成,還可以定義作業的行為。在定義步驟失敗后的行為時,可以
使用的選項與步驟成功時相同。
另外,根據執行的步驟類型的不同,可以定義其他選項或參數。例如,對於Transact-SQL 步驟,可以指定一個輸出文件,將輸出記錄到表,以及在歷史記錄中包含步驟輸出。可以
指定應該作為哪個用戶運行該步驟。

sp_add」obstep
可以使用sp_addjobstep存儲過程將步驟添加到一個現有的作業中。使用該過程可以 將步驟附加到一個現有的作業上,或在兩個現有的步驟之間插入一個新的步驟。表 8-9是
sp addjobstep參數的一個詳細列表。

注 意 :
在 SQL Server聯機叢書中還有其他一些參數,它們被標識為“保留的”.由於它們未 被配置,所以此列表中沒有包括它們。
現在為Poor Performers Report作業創建兩個作業步驟。第一個步驟將生成一個電子郵 件消息,標識了今年的銷售業績沒有超出前一年200 000美元的銷售人員。第二個步驟將
通過電子郵件向管理員說明作業已經成功:
- - Create the First Step
EXECUTE msdb.dbo.sp_add_jobstep
@job_name = * Poor Performers Report *, @step_id =1, @step_name = * Send Report1, ^subsystem =*TSQL*, @command =•DECLARE QtableHTML NVARCHAR(MAX); SET QtableHTML = N''<Hl>Lowest Sales Increase</Hl>" + N* *<table border=l>" + N* *<tr><th>First Name</thxth>Last Name</th>" +

N* *<th>Current Year Sales</th>" + N* *<th>Previous Year Sales</th>H + CAST ((SELECT td = pC.FirstName, •… , td =pC.LastName, •••*, td -sP.SalesYTD, ■… , td =sP.SalesLastYear, ' 1 * * FROM AdventureWorks2008.Sales.Salesperson AS sP INNER JOIN AdventureWorks2008.HumanResources.Employee AS hrE ON sP.BusinessEntitylD =hrE.BusinessEntitylD INNER JOIN AdventureWorks2008.Person.Person AS pC ON hrE.BusinessEntitylD =pC.BusinessEntitylD AND hrE.BusinessEntitylD =pC.BusinessEntitylD WHERE (sP.SalesYTD - sP.SalesLastYear) < 200000 FOR XML PATH(* *tr'*), TYPE ) AS NVARCHAR(MAX) ) +
N*'</table>••;
EXECUTE msdb.dbo.sp_send_dbmail @recipients = * 1 Gregory.House@adventureworks.com'*, ^subject = 1 * First to go...'', @body =@tableHTML, @body_format = ••HTML1 *; 1;
- - Create Step 2 EXECUTE msdb.dbo.sp_add_jobstep @job一name = 1 Poor Performers Report1, @step_id =2, @step一name = *Notify Administrator*, ^subsystem = 1TSQL1, ^command = * EXEC msdb.dbo.sp_send dbmail ^recipients =••administrator@adventureworks.com* *, ^subject = * * Message Sent", Qbody = 1 *The Monthly Sales Report has been sent", @body_format = •* HTML1 •;';
現在,必須使之前創建的步驟在第一步完成后轉到下一步。為此,可以使用
sp updatejobstep存儲過程,如下所示:
EXECUTE msdb.dbo.sp_update jobstep @job_name = 1 Poor Performers Report *, @step_id =1, @on_success_action =3;
在 on success action設置為3 時,這一步驟將轉到下一步。
3 .標記替換
SQL Server 2008在作業步驟中使用標記作為參數占位符。這些標記允許SQL Server

代理服務在運行時使用一個實際值來替換標記(當在SQL Server Management Studio中作為
査詢執行時,不會替換這個標記)。這就像在腳本或應用程序中使用變量一樣。當編寫作業
時,可以考慮使用-些標記提供准確的作業狀態報告。這些標記還可以使作業變得更加靈
活。表 840列出了 SQL Server代理服務支持的標記。

4 .在作業步驟中使用標記
SQL Server 2005 Service Pack 1顯著改變了標記在作業步驟中的使用方式。在這之前,
只能像變量一樣使用標記,如下所示:
PRINT »The database backup of $ (A-DBN) is now complete.▼
如果作業備份了 AdventureWorks2008數據庫,作業步驟將返冋卜列輸出:
* The database backup of AdventureWorks2008 is now complete.'

SQL Server 2008中的作業步驟要求使用轉義宏來成功替換標記。轉義宏用來防止替換 標記的數據中存在無效字符而導致的分析錯誤。例如,如果把SQL Server安裝在一個名為
C: \Finance Department’ s Database的文件夾里,並嘗試使用$ (SQLDIR)標記,那么作業步
驟可能會失敗,因為它會認為值以department結束。表 8-11 列出了轉義宏及其用途。

因此,正確使用標記的方法是在調用標記時使用適當的轉義宏。例如,下面的例子防
止了一個包含了單引號(這是可能的)的數據庫名稱造成命令過早結束:
PRINT 'The database backup of $ (ESCAPE_SQUOTE(A-DBN)) is now complete.*
在 SQL Server 2008中,由於對Windows事件日志有寫權限的用戶可以訪問SQL Server
代理警報或W MI事件激活的作業的步驟,所以在由警報啟動的作業中使用的標記默認是
禁用的。要啟用這些標記,可啟用SQL Server代理屬性的“警報系統”頁中的“為替報的 所有作業響應替換標記”選項。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM