Mirror--如何TSQL查看鏡像狀態和鏡像相關存儲過程

--====================================================
--查看鏡像狀態
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 = 最後 1007 = 最後 5008 = 最後 1,0009 = 最後 1,000,000 行
update_status
指定返回結果以前,過程:
0 = 不更新數據庫的狀態。僅使用最後兩行計算結果,其保留時間取決於什麼時候刷新狀態表。
1 = 經過在計算結果以前調用 sp_dbmmonitorupdate
來更新數據庫的狀態。可是,若是在前 15 秒內已更新狀態表,或用戶不是 sysadmin 固定服務器角色的成員,則 sp_dbmmonitorresults
將運行,而不更新狀態。
 
--============================================================
--建立數據庫鏡像監視器做業,該做業可按期更新服務器實例上每一個鏡像數據庫的鏡像狀態。
sp_dbmmonitoraddmonitoring [ update_period ]
update_period:指定更新間隔(分鐘)。此值能夠是介於 1120 分鐘之間的值。默認值爲 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)
相關文章
相關標籤/搜索