SQL Server代理是所有實時資料庫的核心。代理有很多不明顯的用法,因此系統的知識,對於開發人員還是DBA都是有用的。這系列文章會通俗介紹它的很多用法。 如我們在這個系列的前幾篇文章所見,SQL Server代理是由一系列的作業步驟組成,每個步驟是不同類型將要進行的工作。如果你在第4篇所見,SQ
SQL Server代理是所有實時資料庫的核心。代理有很多不明顯的用法,因此系統的知識,對於開發人員還是DBA都是有用的。這系列文章會通俗介紹它的很多用法。
如我們在這個系列的前幾篇文章所見,SQL Server代理是由一系列的作業步驟組成,每個步驟是不同類型將要進行的工作。如果你在第4篇所見,SQL Server代理也提供使用資料庫郵件發送提醒的能力。如果出現問題,不管怎樣, 你必須去查看下資料庫郵件錯誤日誌。在這篇文章里,你會學到如何理解和查看SQL Server錯誤日誌的所有相關知識。你會查看最常見的錯誤日誌,還有理解如何知道當一條信息需要你採取的行動,什麼是對你最直接的信息。一旦你理解了錯誤日誌,當你進行SQL Server代理相關故障排除時,你會節約大量的時間。
SQL Server代理錯誤日誌
SQL Server代理維護它自己的錯誤日誌,和SQL Server錯誤日誌分開。SQL Server錯誤日誌位置SQL Server所在目錄下的\MSSQL\Log目錄(C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log,這篇文章使用SQL Server 2008R2作為預設實例)。SQL Server錯誤日誌預設名為ERRORLOG(沒有文件擴展名),SQL Server代理錯誤日誌預設名為SQLAGENTOUT。在這篇文章里,我們的大部分時間會花在SQL代理錯誤日誌,不管怎樣,你也需要看下SQL Server錯誤日誌。
查看SQL Server代理錯誤日誌
當你首次瀏覽到\MSSQL目錄,並嘗試查看日誌目錄,很可能你需要請求提升你的許可權來獲得訪問這個目錄的許可權。預設情況下,SQL Server和SQL Server代理的服務賬號有這個目錄的讀寫許可權,但你(使用用戶賬號)不能訪問。如果你是本地管理員,你可以授權自己訪問後,直接查看日誌文件。如圖1所示,預設的許可權和安全設置是這樣的。不要從目錄里移除你服務賬號的許可權,否則SQL Server和SQL Server代理會不能正常工作。
插圖1:SQL Server的Log目錄許可權
一旦你在\MSSQL\LOG目錄里,對於SQL Server和SQL Server代理,你都會看到很多日誌文件,原先的日誌文件(只要正常啟動服務,每次都會創建)也在目錄里。SQLAGENT.OUT文件是SQL Server代理的當前日誌文件,因此這是你要打開的文件。預設情況下,當你嘗試打開這個文件時,你需要選擇打開這個尾碼為.OUT文件的預設程式。記事本就可以,當你有另一個喜好,你可以選擇這個擴展文件名的文本查看器(如圖2所示,選擇記事本)。
插圖2:.OUT文件用記事本打開。
一旦選擇後,SQLAGENT.OUT文件會打開,如插圖3所示。
插圖3:SQL Server代理錯誤日誌(SQLAGENT.OUT)
你很容易發現,應該有更好的方式查看錯誤日誌,沒錯!SSMS有日誌文件查看器,這在第4篇資料庫郵件里就已經簡單介紹了。切換到錯誤日誌,展開SQL Server代理文件夾,錯誤日誌文件夾,你會看到當前SQL Server代理的日誌還有最近的日誌。雙擊【當前】(或右擊選擇【查看代理日誌】)你會看到SQL Server日誌查看器,在查看器里當前SQL Server代理的錯誤日誌已被勾選(如插圖4所示)。
插圖4:當前SQL Server代理日誌文件的日誌文件查看器
這和在插圖3里顯示的日誌文件一樣,但看起來更直觀,更好管理。首先你會註意到的是現在事件分為:信息,警告和錯誤。使用篩選按鈕(如插圖5),你可以增加自己的篩選條件來限制SQL Server代理錯誤日誌的項目(或SQL Server的任何錯誤日誌,你已經看到,在日誌文件查看器里,你可以看到所有的日誌)
插圖5:日誌文件查看器的篩選設置
日誌文件內容
在SQL Server代理日誌的開始就有信息消息。我們每步都過一遍,簡單介紹下消息的意思。
[393] 正在等待 SQL Server 恢複數據庫...
SQL Server代理服務已經啟動,但還不能配置和運行它,因為msdb資料庫還不可用。SQL Server代理的大部分配置和設置都保存在msdb。部分配置細信息保存在系統註冊表裡。SQL Server不能啟動直到msdb資料庫恢復。消息前的數字(393)是SQL Sever代理的內部信息號,本人從沒見過公開文檔記錄SQL Agent的錯誤編號。
[100] Microsoft SQLServerAgent 版本 10.50.1600.1 (內部版本號 x86 unicode 零售): 進程 ID 3412
這是一條非常有用的信息。SQL Server代理版本號(即版本、服務包、和修補程式)。在此例中,它是SQL Server 2008 R2,採用sp1更新包。你可以在SQLServerCentral找到版本號。
接下來的事情是,這是一個SQL Server x86版本(即32位),這是一個標準的零售版本的產品。最後,對SQL
Server代理服務的Windows進程ID標識。如果你使用Windows故障排除工具(即使是簡單的任務管理器),你會看到一個進程ID,這將幫助
你把SQL Server代理服務關聯到Windows信息。
插圖6:有PID列顯示的任務管理器
[101] SQL Server PC201510181429 版本 10.50.1600 (連接限制: 0)
這一消息標識SQL伺服器的名稱(PC201510181429),以及SQL Server的版本號。註意“0連接限制”--即是沒有特定的配置,因此允許無限的連接(直到耗盡記憶體)。
[102] SQL Server ODBC 驅動程式版本 10.50.1600
[103] 驅動程式使用的 NetLib 是 DBNETLIB.DLL;本地主機伺服器是
這兩則消息表明使用ODBC的版本號(SQL Server代理使用ODBC連接回SQL伺服器本地副本,事實上,它是用當地的DBNETLIB.DLL為連接。
[310] 檢測到 2 個處理器和 3327 MB RAM
[339] 本地電腦是 PC201510181429,運行的是 Windows NT 6.1 (7601) Service Pack 1
接下來的兩行顯示的SQL伺服器CPU和記憶體配置,以及Windows版本。
[432] 子系統緩存中有 12 個子系統
這是第二篇(SQL Server代理作業步驟和子系統)討論過的SQL Server代理子系統。作業下有各種類型可以運行子系統(如CmdExec、ActiveX 腳本)以及一些支持複製,分析服務的子系統,你可以在msdb.dbo.syssubsystems表中查看子系統清單。
[364] 尚未啟動 Messenger 服務 - 將不發送 NetSend 通知
雖然這個歸類為一個錯誤,在大部分系統上你可以安全地忽略。Net send通知,已經從SQL Server的幾個版本中取消,並且相關的Windows服務預設不是開啟的。如果你還在使用Net send消息,看到了這樣的錯誤,你需要更改Windows Messenger服務為自動啟動。
[129] SQLSERVERAGENT 在 Windows NT 服務控制下啟動
這個消息表明,SQL Server代理作為服務啟動,而不是在命令提示符視窗。
[260] 無法啟動郵件會話(原因: Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseException: 無法從資料庫中讀取郵件配置信息。......
[355] 郵件系統初始化失敗;請檢查配置設置
這些消息表明在資料庫郵件配置中出錯。回顧第四篇資料庫郵件,查看是否有類似的問題。
[396] 尚未定義空閑 CPU 條件 - OnIdle 作業計劃將不起任何作用
這條警告表明一個SQL Server代理設置沒有配置,可能阻止某些作業運行。你可以設置作業在CPU“空閑”時運行(在第一篇提到過)。然而,在這個系統中空閑的定義還沒有被 設置。在SSMS配置此選項,右擊SQL Server代理,選擇屬性,然後單擊高級選項卡。配置空閑CPU條件如插圖7所示
插圖7:配置空閑CPU條件
你可以想象,在你的SQL Server代理錯誤日誌還會有許多其他的錯誤,你應該定期檢查日誌。請牢記,代理日誌不是用來排查作業故障的,你需要查看每個失敗作業步驟的歷史記錄。我們在後續章節會做更多的故障排除。
配置SQL Server代理錯誤日誌
您可以在SSMS中配置一些SQL Server代理錯誤日誌的屬性,另一些屬性需要使用註冊表編輯器(這是不支持的,所以不建議在生產系統)。
右
擊SSMS中SQL Server代理->錯誤日誌,你會看到一組選項。首先是“配置”,選擇該選項,你會看到類似圖5.8。你可以更改SQL
Server代理錯誤日誌文件的存放位置(不推薦),同樣可以更改代理日誌級別。這些設置不能憑直觀分辨–如果你勾選“錯誤”,你會看到錯誤和信息性消
息。如果你勾選“警告”,你會看到警告和信息性消息。如果你只勾選信息,在錯誤日誌中你看不到任何錯誤或警告消息。
對話框中另一選項是,寫入OEM錯誤日誌,意味著寫一個非Unicode的錯誤日誌文件。理論上你可以通過它節省空間,但也不推薦。
插圖8——配置SQL Server代理
退出插圖8,右擊錯誤日誌,另一個選項是“回收”。此選項會關閉現有的SQL Server代理錯誤日誌並開始一個新的日誌文件,重命名當前SQLAGENT.OUT文件為SQLAGENT.1(所有舊的文件尾碼數字遞增,如 SQLAGENT.1變成SQLAGENT.2)。如果你要將當前的日誌文件發送給SQL Server產品支持,這樣操作將非常有用。
SQL
Server代理一些其他配置需在註冊表中設置(事實上,上面所做操作的設置都會更改註冊表中對應的鍵值)。記住不建議直接修改註冊表,所以更改這些設置
要你自己承擔風險。然而,如果你想查看可用的設置(一些SQL Server代理設置只能在註冊表中修改),你可以在註冊表中SQL
Server實例下查看可用的註冊表鍵設置。例如,在我的機器上,註冊表鍵位於HKEY_LOCAL_MACHINE\SOFTWARE
\Microsoft\Microsoft SQL
Server\MSSQL10_50.MSSQLSERVER\SQLServerAgent,如插圖9所示
插圖9:SQL Server代理的註冊表項
如果你的SQL Server代理配置真的有問題時,可能需要描述(或導出)這些設置給產品支持。
下篇預告
SQL Server代理錯誤日誌包含很多有用信息(SQL Server代理,SQL Server和Windows伺服器)。你可以使用錯誤日誌解決SQL Server代理服務中的錯誤,並瞭解日誌中常見的信息。本文還介紹瞭如何解決SQL Server代理中一些最常見的錯誤。
有了前面的SQL Server代理基礎知識,第六篇將深入挖掘SQL Server代理作業步驟和工作流。