1. 程式人生 > >SQLServer:鏡像監控之oldest unsent transaction告警自愈

SQLServer:鏡像監控之oldest unsent transaction告警自愈

sql server 鏡像

本文將介紹sqlserver鏡像監控中出現Oldest Unsent Transaction Threshold告警如何自愈


鏡像監控的數據及告警由Database Mirroring Monitor Job作業進行記錄及觸發,當Oldest Unsent Transaction超過Threshold時,觸發代碼為32040的錯誤信息。


告警的出現可能跟主體服務器實例和鏡像服務器實例中的負載及它們的網絡連接相關(博主在維護中遇到的情況大多是這樣),但是在負載或網絡連接恢復正常後,Oldest Unsent Transaction告警信息依然持續出現,直到backup database或者backup log後,告警才消失。


關於這個問題可在以下連接查看相關詳細信息

Spurious Oldest Unsent Transaction alerts for database mirroring


從實例日誌中可知告警信息如下:

The alert for ‘oldest unsent transaction‘ has been raised. The current value of ‘35‘ surpasses the threshold ‘30‘.


如果是只有一個數據庫配置鏡像,那麽很容易定位出現告警的數據庫;如果是多個數據庫配置鏡像,從告警信息中,我們無法得知到底是哪個數據庫出現告警。


那麽,實現自愈難點:

1. 告警數據是哪個

2. 如何計算oldest unsent transaction


通過分析Database Mirroring Monitor Job,我們可以知道Oldest Unsent Transaction告警的出現是由於sys.database_mirroring表的end_of_log_lsn與mirroring_failover_lsn之間相差較大,在Database Mirroring Monitor Job作業中進行Oldest Unsent Transaction計算時結果超出了Threshold,因此觸發告警。


我們先總結一下:

(1) 告警是由於sys.database_mirroring表的end_of_log_lsn與mirroring_failover_lsn之間相差較大導致

(2) Database Mirroring Monitor Job作業能分析並得知是哪個數據庫告警

(3) backup database、backup log後告警會消失


如何獲取告警時的數據庫名,有2種方法:

1. 改寫Database Mirroring Monitor Job作業中相關的存儲過程,自定義錯誤代碼及信息

可參考SQL Sentry(SQL哨兵)的技術支持Steve Wright的博客,有詳細的改寫代碼


2. 提取Database Mirroring Monitor Job作業中相關代碼進行改寫,自定義代碼段進行獲取數據

(1)建表

技術分享

(2)收集數據

技術分享



獲取到告警相關數據後,我們就可以開始制定相關的“自愈”方案


先決條件(可根據實際情況添加):

1. 主體與鏡像連接正常

select

database_id,mirroring_role,mirroring_role_desc,

mirroring_state,mirroring_state_desc,

mirroring_partner_instance,mirroring_partner_name

from sys.database_mirroring

where database_id=@database_id


2. 主體無長事務正在運行

--查詢執行時長超過dbm_monitor_alerts表time_behind閾值的事務

declare @database_id int

declare @time_behind int

set @database_id=5

select @time_behind=time_behind from msdb..dbm_monitor_alerts where database_id=@database_id

select count(1) as long_transactions_count from sys.dm_tran_database_transactions dt,sys.dm_tran_active_transactions st

where dt.transaction_id=st.transaction_id

and dt.database_id=@database_id

and DATEDIFF(minute, st.transaction_begin_time, GETDATE())>@time_behind


3. 無備份在運行

SELECT *

FROM sys.dm_exec_requests AS er

WHERE er.database_id=@database_id

and er.command in (‘BACKUP LOG‘,‘BACKUP DATABASE‘)


根據先決條件寫成Oldest Unsent Transaction告警自愈腳本


技術分享


部署方式:

1. 創建Sql Agent Alerts監控錯誤代碼:32040,在Response選項中設置Execute Job為鏡像告警處理作業

2. 在鏡像告警處理作業中第1步為收集數據,第2步為告警自愈


至此,Oldest Unsent Transaction告警自愈已實現,根據實際監控情況進行相關細節的優化


本文出自 “aimax” 博客,轉載請與作者聯系!

SQLServer:鏡像監控之oldest unsent transaction告警自愈