您好,登錄后才能下訂單哦!
監控SQL Server數據庫異常鏡像狀態發告警郵件
在部署了數據庫鏡像之后,我們需要監控參與鏡像的主數據庫和鏡像數據庫的狀態,如果狀態異常,發送告警郵件。那么這個腳本需要在主和鏡像服務器上都運行。
目錄視圖sys.database_mirroring對SQL Server實例上的每個數據庫都包含一行(包括系統數據庫和未配置鏡像的數據庫),當然也包含所有鏡像數據庫的狀態信息。我們可以查詢該目錄視圖,對于每個異常狀態的鏡像數據庫觸發告警郵件。筆者的環境配置的是異步鏡像,依賴于手動故障轉移。
前提條件:
1. 配置好數據庫郵件,有正確的Profile。
2. 有權限發送郵件的有效Login,需要是msdb數據庫中DatabaseMailUserRole角色成員。
3. 一對用于監控的鏡像數據庫。
DECLARE @state VARCHAR(30) DECLARE @DbMirrored INT DECLARE @DbId INT DECLARE @String VARCHAR(100) DECLARE @databases TABLE (DBid INT, mirroring_state_desc VARCHAR(30)) -- get status for mirrored databases INSERT @databases SELECT database_id, mirroring_state_desc FROM sys.database_mirroring WHERE mirroring_role_desc IN ('PRINCIPAL','MIRROR') AND mirroring_state_desc NOT IN ('SYNCHRONIZED','SYNCHRONIZING') -- iterate through mirrored databases and send email alert WHILE EXISTS (SELECT TOP 1 DBid FROM @databases WHERE mirroring_state_desc IS NOT NULL) BEGIN SELECT TOP 1 @DbId = DBid, @State = mirroring_state_desc FROM @databases SET @string = 'Host: '+@@servername+'.'+CAST(DB_NAME(@DbId) AS VARCHAR)+ ' - DB Mirroring is '+@state +' - notify DBA' EXEC msdb.dbo.sp_send_dbmail 'valid_mail_profile', 'DBA@xxx.com', @body = @string, @subject = @string DELETE FROM @databases WHERE DBid = @DbId END --also alert if there is no mirroring just in case there should be mirroring :) SELECT @DbMirrored = COUNT(*) FROM sys.database_mirroring WHERE mirroring_state IS NOT NULL IF @DbMirrored = 0 BEGIN SET @string = 'Host: '+@@servername+' - No databases are mirrored on this server - notify DBA' EXEC msdb.dbo.sp_send_dbmail 'valid_mail_profile', 'DBA@xxx.com', @body = @string, @subject = @string END
依賴于手動故障轉移。將以上腳本放到主服務器和鏡像服務器上的作業里,每5分鐘執行一次。
收到郵件效果如下:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。