--==================================================== --查看鏡像狀態 SELECT DB_NAME(database_id) AS DatabaseName, dm.mirroring_role AS MirroringRole, (CASE dm.mirroring_role WHEN 1 THEN '主體' WHEN 2 THEN '鏡像' END) AS MirroringRoleDesc, dm.mirroring_partner_name AS MirroringPartnerName, (CASE WHEN dm.mirroring_witness_name IS NULL THEN '--' ELSE dm.mirroring_witness_name END)AS MirroringWitnessName, dm.mirroring_state AS MirroringState, (CASE dm.mirroring_state WHEN 0 THEN '已掛起' WHEN 1 THEN '與其餘夥伴斷開' WHEN 2 THEN '正在同步' WHEN 3 THEN '掛起故障轉移' WHEN 4 THEN '已同步' WHEN 5 THEN '夥伴未同步' WHEN 6 THEN '夥伴已同步' WHEN NULL THEN '無鏡像' END) AS MirroringStateDesc, dm.mirroring_safety_level AS MirroringSafetyLevel, (CASE dm.mirroring_safety_level WHEN 0 THEN '未知' WHEN 1 THEN '異步' WHEN 2 THEN '同步' WHEN NULL THEN '無鏡像' END) AS MirroringSafetyLevelDesc, dm.mirroring_witness_state AS MirroringWitnessState, (CASE dm.mirroring_witness_state WHEN 0 THEN '見證未知' WHEN 1 THEN '見證鏈接' WHEN 2 THEN '見證斷開' WHEN NULL THEN '無見證' END) AS MirroringWitnessStateDesc FROM sys.database_mirroring dm WHERE dm.mirroring_guid IS NOT NULL --============================================================ --查看鏡像的日誌傳送 sp_dbmmonitorresults database_name , rows_to_return , update_status database_name 指定返回其鏡像狀態的數據庫。 rows_to_return 指定返回的行數: 0 = 最後一行 1 = 最後兩小時的行 2 = 最後四小時的行 3 = 最後八小時的行 4 = 最後一天的行 5 = 最後兩天的行 6 = 最後 100 行 7 = 最後 500 行 8 = 最後 1,000 行 9 = 最後 1,000,000 行 update_status 指定返回結果以前,過程: 0 = 不更新數據庫的狀態。僅使用最後兩行計算結果,其保留時間取決於什麼時候刷新狀態表。 1 = 經過在計算結果以前調用 sp_dbmmonitorupdate 來更新數據庫的狀態。可是,若是在前 15 秒內已更新狀態表,或用戶不是 sysadmin 固定服務器角色的成員,則 sp_dbmmonitorresults 將運行,而不更新狀態。 --============================================================ --建立數據庫鏡像監視器做業,該做業可按期更新服務器實例上每一個鏡像數據庫的鏡像狀態。 sp_dbmmonitoraddmonitoring [ update_period ] update_period:指定更新間隔(分鐘)。此值能夠是介於 1 到 120 分鐘之間的值。默認值爲 1 分鐘。 --============================================================ --自定義查詢 --sp_dbmmonitoraddmonitoring 數據來源於dbm_monitor_data WITH tmp AS( SELECT ROW_NUMBER()OVER( PARTITION BY dm.database_id ORDER BY dm.[local_time] DESC) AS RID, * FROM msdb.dbo.dbm_monitor_data dm) SELECT * FROM tmp WHERE RID=1 -------------------------------------------------------------------------------- --補充資料 --============================================ --MSDN: http://technet.microsoft.com/zh-cn/library/ms173768.aspx --sp_dbmmonitorupdate 會插入鏡像相關數據,並將超過天的歷史數據刪除。
--=================================================================== --建立數據庫鏡像監視器做業,該做業可按期更新服務器實例上每一個鏡像數據庫的鏡像狀態。 --sp_dbmmonitoraddmonitoring [ update_period ] --update_period --指定更新間隔(分鐘)。此值能夠是介於1 到120 分鐘之間的值。默認值爲1 分鐘。 --要求具備sysadmin 固定服務器角色的成員身份運行,更新間隔太小會影響性能 EXEC msdb.sys.sp_dbmmonitoraddmonitoring 3; --=================================================================== --更改數據庫鏡像監視參數,設置監視器更新頻率 --sp_dbmmonitorchangemonitoring parameter, value --parameter --指定要更改的參數的標識符。當前,只有如下參數可用: --1 = 更新週期,數據庫鏡像狀態表的更新間隔期的分鐘數。默認間隔爲1 分鐘。 --value --爲正在更改的參數指定新值。範圍在1 到120 的整數,用於指定新的更新週期(分鐘)。 exec msdb.sys.sp_dbmmonitorchangemonitoring 1,2 --=================================================================== --查看監視器更新頻率 --sp_dbmmonitorhelpmonitoring exec msdb.sys.sp_dbmmonitorhelpmonitoring --=================================================================== --sp_dbmmonitorresults database_name , rows_to_return, update_status --database_name --指定返回其鏡像狀態的數據庫。 --rows_to_return --指定返回的行數: --0 = 最後一行 --1 = 最後兩小時的行 --2 = 最後四小時的行 --3 = 最後八小時的行 --4 = 最後一天的行 --5 = 最後兩天的行 --6 = 最後100 行 --7 = 最後500 行 --8 = 最後1,000 行 --9 = 最後1,000,000 行 --update_status --指定返回結果以前,過程: --0 = 不更新數據庫的狀態。僅使用最後兩行計算結果,其保留時間取決於什麼時候刷新狀態表。 --1 = 經過在計算結果以前調用sp_dbmmonitorupdate 來更新數據庫的狀態。 --可是,若是在前15 秒內已更新狀態表,或用戶不是sysadmin 固定服務器角色的成員, --則sp_dbmmonitorresults 將運行,而不更新狀態。 EXEC msdb.sys.sp_dbmmonitorresults DB1, 2, 0; --=================================================================== --中止並刪除服務器實例上全部數據庫的鏡像監視器做業。 --要求具備sysadmin 固定服務器角色的成員身份。 EXEC msdb.sys.sp_dbmmonitordropmonitoring --=================================================================== --檢查dbm_monitor_data中數據是否有超過閥值數據,若是有,則報警 --status: 數據庫的狀態:= 已掛起1 = 已斷開2 = 正在同步3 = 掛起故障轉移4 = 已同步 --send_queue_size:在主體的發送隊列中未發送日誌的大小(KB)。 --redo_queue_size:鏡像中重作隊列的大小(KB)。 --role:服務器實例的當前鏡像角色:= 主體1 = 鏡像, --witness_status:見證狀態:= 未知1 = 已鏈接2 = 已斷開 use msdb; GO IF (OBJECT_ID('tempdb.dbo.#MirrorResult') IS NOT NULL) BEGIN DROP TABLE #MirrorResult END GO WITH tmp AS( SELECT ROW_NUMBER()OVER(PARTITION BY Database_id ORDER BY local_time DESC) AS RID, * FROM msdb.dbo.dbm_monitor_data ) SELECT * INTO #MirrorResult FROM tmp WHERE RID=1 AND ( ([status]<>2 AND [status]<>4) OR send_queue_size>30000 OR redo_queue_size>30000) --若是表不爲空,則鏡像可能出現問題 IF EXISTS(SELECT 1 FROM #MirrorResult) BEGIN DECLARE @databaseNames NVARCHAR(MAX); DECLARE @errorMessage NVARCHAR(MAX); SET @databaseNames=''; SELECT @databaseNames=@databaseNames+DBS.name+'/' FROM #MirrorResult MR INNER JOIN master.sys.databases DBS ON MR.database_id=DBS.database_id set @errorMessage= '數據庫:'+@databaseNames+' 鏡像斷開或者存在大量日誌爲發送或重作' --發送警告 PRINT @errorMessage END --===================================================================
--============================================================================= --查看當前掛起的鏡像或有大量日誌積壓的鏡像 WITH tmp AS( SELECT ROW_NUMBER()OVER(PARTITION BY Database_id ORDER BY local_time DESC) AS RID, * FROM msdb.dbo.dbm_monitor_data ) SELECT * INTO #MirrorResult FROM tmp WHERE RID=1 AND ( ([status]<>2 AND [status]<>4) OR send_queue_size>30000 OR redo_queue_size>30000)