SQL Server自動化運維繫列——關於郵件通知那點事(.Net開發人員的福利)

需求描述html

在咱們的生產環境中,大部分狀況下須要有本身的運維體制,包括本身健康狀態的檢測等。若是發生異常,須要提早預警的,通知形式通常爲發郵件告知。數據庫

郵件做爲一種很是便利的預警實現方式,在及時性和易用性方面也有着不可替代的優勢。c#

因此,在本篇中將詳細的分析下在SQL Server中的郵件通知功能及使用方式等。 服務器

本篇實現運維

一、經過SQL Server自帶的郵件功能實現運維的預警及檢測post

二、利用數據庫郵件組件代替傳統的C#發送郵件的弊端性能

三、實現Job任務運行狀態的檢測測試

四、利用PowerShell實現Job任務計劃的檢測編碼

<1>基礎配置url

首先,咱們來配置下SQL Server中的郵件組件的基礎服務項。SQL Server自從05版本起,郵件功能就不須要開啓外配配置管理器了,它有着本身的組件,實現郵件發送的功能。

若是,沒使用過,能夠按照如下步驟進行配置,步驟很簡單。

右鍵,配置數據庫郵件

而後直接下一步就行,而後新建一個帳戶

而後,下一步完成就能夠,步驟很簡單,這裏面有幾個概念須要理清楚,對於SQL Server的郵件帳戶是由權限控制的,目的是實現不一樣的人使用不一樣的郵件帳戶,好比大型數據庫的管理通常有好幾個DBA負責運維,分職責以後的運行,發送預警郵件也就產生了區分,總不能模塊中出現了任何問題都發送給一我的。

跟你一毛錢關係都沒有的異常,每天給你發郵件,是否是很不爽??....這種管理方式是灰常暴力的!

爲了解決上述問題,SQL Server對郵件的帳戶進行了分類:

 

分爲公共帳戶和專用帳戶。

通常若是管理人員少,就配置一個公共帳戶就能夠,有問題都發送到該郵箱就能夠。

至此,你已經完成了數據庫郵件模塊的配置,步驟很簡單。這裏能夠發送一封測試郵件,來測試下郵件的連通性。

提示:SQL Server郵件組件的運行需呀SQL Server Age運行執行,因此須要確保此服務正在運行。

在「數據庫郵件」上右鍵,發送測試電子郵件,輸入目標郵箱的地址,而後單擊發送就能夠。

 

至此,你的SQL Server已經完成郵件組件的基礎配置,而後剩下的工做就是如何利用該組件進行部分工做的完成了。

 

<2>c#調用數據庫郵件組件進行郵件的發送 

還記得當年剛畢業的時候,對於發送郵件這塊功能當時是異常的癡迷,各類的研究和各類的調試。

後來的終歸在廢了九牛二虎之力以後,終於在一個午夜夢迴之時看到了我求之不得的測試郵件發送通知,想一想一個字描述:草!

大致我記得須要引用如下幾個命名空間:using System.Net;  using System.Net.Mail; 

而後利用C#提供的SmtpClient類進行組裝成郵件實體,然後一個Send()方法,這其中的痛苦點在於各類編碼規範等。

我相信如今也有不少程序猿依然再採用着這種方式。

今天提供另一種靈活的實現方式,利用SQL Server數據庫的郵件組件進行郵件的發送。

關於上面第一個步驟提供的郵件組件的調用,其實在SQL Server中是提供系統自帶的存儲過程進行實現的。方法以下:

該存儲過程提供了發送郵件的的各類參數,徹底知足發送郵件的各類需求,好比:主題、內容、附件、CC、祕密CC....等等吧

調用該存儲過程的方法以下:

    --存儲過程調用發郵件
    EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'testMail',
    @recipients = '787449667@qq.com',
    @body = '這是測試郵件',
    @subject = '我發的', 
    @file_attachments='C:\temp\3-26-2015-16-20-21.png'

上面一個簡單的方法執行既能夠實現,郵件的發送。

而後,你須要的就是c#調用該存儲過程了。

關於寫C#代碼經過Ado.net調用存儲過程的過程這裏就不贅述了,我相信這是入門級別的小白也能搞定的事情了。

然後,這裏捎帶分析一下郵件組件的原理和性能問題。我相信這是不少人關心的,其實SQL Server的郵件發送時經過一個底層的JOB輪詢執行的,因此根本不用擔憂其執行順序和性能問題。

而且SQL Server爲此還提供了幾個系統的視圖來查看歷史運行狀態和當前郵件的隊列狀態:

    --郵件內容
    SELECT * FROM msdb.dbo.sysmail_allitems

    --郵件發送日誌
    SELECT * FROM msdb.dbo.sysmail_event_log

而且SQL Server提供了郵件從新發送的功能以及其它默認參數,具體設置參照此畫面:

至此,已經完成了利用C#進行發送郵件的功能。

我相信基本上用C#就會搭配微軟本身的SQL Server數據庫,而使用它以後就能夠少許的代碼實現郵件發送的功能。

 

 <3>實現Job任務運行狀態的檢測 

在咱們使用SQL Server的時候,不少狀況下都須要自定義Job進行部分功能的實現,而大部分時間是採起凌晨或者非業務期進行工做。

而此Job的運行結果的檢測便造成了一個須要跟蹤的問題,好比有時候N個Job的運行,只有幾個出現問題,而且不肯定的此Job發生在那個機器上,因此自動化運維的重要性就不言而喻了。

對於上面問題的解決,SQL Server提供了很簡單的配置就能夠實現。

(1)首先,須要定義幾個操做員,說到底就是幾我的值班運維此數據庫的

 

上面,我就定義了一我的,其實能夠定義多我的,幾個運維人員幾個...

(2)其次,須要定義警報,說到底就是將產生的預警發送給上面的幾個運維人員。

這裏面的嚴重性選項實際上是一個很重要的功能,一些簡單的問題警告有時候是不須要及時關注的,或者說不須要暫時處理的。

可是有些問題則須要裏面去解決,好比服務器宕機....

而後,咱們來將此預警關聯之操做員

到此,咱們已經完成了預警的檢測配置,而後須要的就是關聯下Job代理的任務屬性值。

通過上面的配置,任何咱們自定義的Job工做狀態均可以進行自動化檢測了。

好比:某個Job跑批成功了,某個Job跑批失敗了。咱們來新建一個自定義的Job來測試下:

 

而後設置警告

而後,在運行此Job出現異常的時候,就能夠自動的報告到相應的運維人員了。

這裏咱們就設置了一個運維人員,因此這裏只發送給一我的。

咱們來手動運行下,來測試一下效果

嘿嘿,果真,發出了警報,看起來很貼心的樣子

 

至此,此功能已經配置完成,本身能夠靈活的實現。

 

 <4>利用PowerShell實現Job任務計劃的檢測

關於Job的明細日誌,請參照以下文章:

SQL Server自動化運維繫列——監控跑批Job運行狀態(Power Shell)

 

結語 

原本打算將利用Power Shell腳本檢測的功能實現方式也加上的,但文章已經稍有點篇幅了,後續再完成吧。此篇的關於SQL Server的郵件功能算做拋磚引玉了,本身另有需求能夠本身靈活實現。

其實,在本篇所介紹的Job任務的檢測在幾臺服務器上存在還問題不大,可是若是多臺服務器,若是每臺服務器上都有幾個Job異常的話,天天早上打開郵件多的估計會令你頭皮發麻,而且在自帶的異常報警中,沒有給出詳細的錯誤信息,其實這是一個很不爽弊端。

因此,爲了優雅的進行自動化運維的工做,咱們將會每次將咱們全部檢測的服務器Job運行狀態進行掃描,然後將其彙總至一封郵件,而後按照重要性發送至固定的運維人員。

聽起來是否是還有點小激動的樣子,下一篇咱們來實現此功能。有興趣的童鞋,能夠提早關注。

關於SQL Server自動化運維和檢測的內容很普遍,其中不少都是從平常的經驗中出發,一步步的從手動到自動的過程。

提示:測試的時候記得改一下收件箱地址,不要往個人的郵箱發送!!!切記。 

若是您看了本篇博客,以爲對您有所收穫,請不要吝嗇您的「推薦」。  

相關文章
相關標籤/搜索