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

來源:互聯網
上載者:User

標籤: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)建表

650) this.width=650;" src="https://s1.51cto.com/oss/201711/06/fbe054927cefe561a1b2b0d4d5e5fbef.png-wh_500x0-wm_3-wmp_4-s_1706917713.png" title="51_1.png" alt="fbe054927cefe561a1b2b0d4d5e5fbef.png-wh_" />

(2)收集資料

650) this.width=650;" src="https://s2.51cto.com/oss/201711/06/6688deda0f86c75cdeb5b6e62f0c8c41.png-wh_500x0-wm_3-wmp_4-s_17753087.png" title="51_2.png" alt="6688deda0f86c75cdeb5b6e62f0c8c41.png-wh_" />



擷取到警示相關資料後,我們就可以開始制定相關的“自愈”方案


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

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 [email protected]_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 [email protected]_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 [email protected]_id

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


3. 無備份在運行

SELECT *

FROM sys.dm_exec_requests AS er  

WHERE [email protected]_id 

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


根據先決條件寫成Oldest Unsent Transaction警示自愈指令碼


650) this.width=650;" src="https://s1.51cto.com/oss/201711/06/0af971c0835233c8355651f453b9d867.png-wh_500x0-wm_3-wmp_4-s_2936849611.png" title="51_3.png" alt="0af971c0835233c8355651f453b9d867.png-wh_" />


部署方式:

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

2. 在鏡像警示處理作業中第1步為收集資料,第2步為警示自愈


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


本文出自 “aimax” 部落格,轉載請與作者聯絡!

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.