資料庫鏡像夥伴狀態

Microsoft.SQLServer.2012.Mirroring.PartnersStateMonitor (UnitMonitor)

此監視器會檢查資料庫鏡像是否已同步處理。

Knowledge Base article:

摘要

此監視器會查看 Microsoft® SQL Server™ 所回報的資料庫鏡像工作階段狀態。其使用方式是對 SQL Server 執行個體的 master 資料庫執行查詢,並傳回該資料庫鏡像工作階段的狀態。如果您從此監視器收到警示,就需要採取動作才能將資料庫鏡像工作階段回復到運作的狀態。

原因

狀況不佳的狀態表示 SQL Server™ 資料庫鏡像工作階段不在運作的狀態下。可能的狀態詳述如下:

鏡像夥伴狀態

描述

MOM 健全狀況狀態

IN_SYNC

這是正常運作狀態。鏡像夥伴已同步處理,而且鏡像正常執行。

狀況良好

OUT_OF_SYNC

鏡像夥伴未同步。

重大

解決方式

若要解決此問題,請嘗試下列動作::

可覆寫的參數

名稱

描述

預設值

間隔 (秒)

執行工作流程的週期性時間間隔 (秒)。

900

同步處理時間

使用 24 小時制指定的同步處理時間。將會忽略。

 

逾時 (秒)

指定允許工作流程在關閉且標示為失敗之前執行的時間。

300

已啟用

啟用或停用該工作流程。

產生警示

定義工作流程是否會產生警示。

警示嚴重性

定義警示嚴重性。

錯誤

警示優先程式

定義警示優先順序。

正常

Element properties:

TargetMicrosoft.SQLServer.2012.Mirroring.Witness
Parent MonitorSystem.Health.AvailabilityState
CategoryAvailabilityHealth
EnabledTrue
Alert GenerateTrue
Alert SeverityError
Alert PriorityNormal
Alert Auto ResolveTrue
Monitor TypeMicrosoft.SQLServer.2012.Mirroring.ScriptedTwoStateType
RemotableTrue
AccessibilityPublic
Alert Message
資料庫鏡像夥伴未同步處理
資料庫鏡像 '{0}' 未同步處理。鏡像夥伴為 '{1}' 和 '{2}'。
RunAsMicrosoft.SQLServer.SQLProbeAccount

Source Code:

<UnitMonitor ID="Microsoft.SQLServer.2012.Mirroring.PartnersStateMonitor" Accessibility="Public" Enabled="true" Target="SQL2012Mirroring!Microsoft.SQLServer.2012.Mirroring.Witness" ParentMonitorID="Health!System.Health.AvailabilityState" TypeID="Microsoft.SQLServer.2012.Mirroring.ScriptedTwoStateType" Remotable="true" Priority="Normal" ConfirmDelivery="false" RunAs="SQL!Microsoft.SQLServer.SQLProbeAccount">
<Category>AvailabilityHealth</Category>
<AlertSettings AlertMessage="Microsoft.SQLServer.2012.Mirroring.PartnersStateMonitor.AlertMessage">
<AlertOnState>Error</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>Normal</AlertPriority>
<AlertSeverity>Error</AlertSeverity>
<AlertParameters>
<AlertParameter1>$Target/Property[Type="SQL2012Mirroring!Microsoft.SQLServer.2012.Mirroring.Witness"]/DatabaseName$</AlertParameter1>
<AlertParameter2>$Target/Property[Type="SQL2012Mirroring!Microsoft.SQLServer.2012.Mirroring.Witness"]/Principal$</AlertParameter2>
<AlertParameter3>$Target/Property[Type="SQL2012Mirroring!Microsoft.SQLServer.2012.Mirroring.Witness"]/Mirror$</AlertParameter3>
</AlertParameters>
</AlertSettings>
<OperationalStates>
<OperationalState ID="Good" MonitorTypeStateID="Good" HealthState="Success"/>
<OperationalState ID="Bad" MonitorTypeStateID="Bad" HealthState="Error"/>
</OperationalStates>
<Configuration>
<ScriptName>GetSQL2012MirroringPartnersState.vbs</ScriptName>
<ScriptBody><Script>'#Include File:GetSQL2008MirroringPartnersState.vbs
'Copyright (c) Microsoft Corporation. All rights reserved.
' This script takes a single parameter
' Param 0: The SQL connection string to connect to

Const SQL_MONITORING_CONNECT_FAILURE = -1
Const SQL_MONITORING_QUERY_FAILURE = -2
Const SQL_MONITORING_SUCCESS = 0

Const SCRIPT_EVENT_ID = 4001

Dim GetPartnersStatusQuery
GetPartnersStatusQuery = "SELECT " &amp;_
" mirroring_guid, " &amp;_
" partner_sync_state_desc " &amp;_
" FROM sys.database_mirroring_witnesses "

Call GetPartnersStatus()

Sub GetPartnersStatus()
If WScript.Arguments.Count = 4 Then
Dim oBag
Set oBag = oAPI.CreatePropertyBag()

Dim state, serviceName

serviceName = GetSQLServiceName(WScript.Arguments(2))
state = GetServiceState(WScript.Arguments(1), serviceName)

if (state &lt;&gt; "Running") And (state &lt;&gt; "Unknown") Then
Call oAPI.Return(oBag)
WScript.Quit()
End If

Dim nResult
nResult = PartnersStatus(WScript.Arguments(0), oBag, WScript.Arguments(1), WScript.Arguments(2), WScript.Arguments(3))
Call oAPI.Return(oBag)
On Error Resume Next
Call GlobalErrorListToEventLog()
Else
On Error Resume Next
Call GlobalErrorListToEventLog()
Wscript.Quit()
End If
End Sub

Function PartnersStatus(ByVal sSQLConnectionString, ByRef oBag, ByVal sComputerName, ByVal sInstanceName, ByVal sTcpPort)
Dim e
Set e = New Error

Dim cnADOConnection
Set cnADOConnection = SmartConnectWithoutSQLADODB(sSQLConnectionString, sTcpPort, sComputerName, sInstanceName, "master")
if cnADOConnection Is Nothing Then
PartnersStatus = SQL_MONITORING_CONNECT_FAILURE
ThrowScriptErrorNoAbort "Cannot connect to '" &amp; sSQLConnectionString &amp; "' SQL Server", e
Exit Function
End If

Dim oResults
e.Clear
On Error Resume Next
Set oResults = cnADOConnection.Execute(GetPartnersStatusQuery)
e.Save
On Error Goto 0
If e.Number &lt;&gt; 0 Then
PartnersStatus = SQL_MONITORING_QUERY_FAILURE
ThrowScriptErrorNoAbort "Query execution failed for '" &amp; sSQLConnectionString &amp; "' SQL Server", e
If (oResults &lt;&gt; null) Then oResults.Close
cnADOConnection.Close
Exit Function
End If

Do While Not oResults.EOF
Call oBag.AddValue(oResults(0), CStr(oResults(1)))
oResults.MoveNext
Loop

cnADOConnection.Close
PartnersStatus = SQL_MONITORING_SUCCESS
End Function
</Script></ScriptBody>
<IntervalSeconds>900</IntervalSeconds>
<SyncTime/>
<TimeoutSeconds>300</TimeoutSeconds>
<ConnectionString>$Target/Host/Host/Property[Type="SQL!Microsoft.SQLServer.DBEngine"]/ConnectionString$</ConnectionString>
<GoodExpression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="String">Property[@Name='$Target/Property[Type="SQL2012Mirroring!Microsoft.SQLServer.2012.Mirroring.Witness"]/MirroringGUID$']</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="String">IN_SYNC</Value>
</ValueExpression>
</SimpleExpression>
</GoodExpression>
<BadExpression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="String">Property[@Name='$Target/Property[Type="SQL2012Mirroring!Microsoft.SQLServer.2012.Mirroring.Witness"]/MirroringGUID$']</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="String">OUT_OF_SYNC</Value>
</ValueExpression>
</SimpleExpression>
</BadExpression>
</Configuration>
</UnitMonitor>