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

來源:互聯網
上載者:User

標籤:

需求描述

在我們的生產環境中,大部分情況下需要有自己的營運體制,包括自己健康狀態的檢測等。如果發生異常,需要提前預警的,通知形式一般為發郵件告知。

郵件作為一種非常便利的預警實現方式,在及時性和易用性方面也有著不可替代的優點。

所以,在本篇中將詳細的分析下在SQL Server中的郵件通知功能及使用方式等。 

本篇實現

1、通過SQL Server內建的郵件功能實現營運的預警及檢測

2、利用資料庫郵件組件代替傳統的C#發送郵件的弊端

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

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

<1>基礎配置

首先,我們來配置下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 = ‘[email protected]‘,    @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自動化營運和檢測的內容很廣泛,其中很多都是從日常的經驗中出發,一步步的從手動到自動的過程。

 

如果您看了本篇部落格,覺得對您有所收穫,請不要吝嗇您的“推薦”。 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.