Состояние зеркальной базы данных

Microsoft.SQLServer.2016.Mirroring.DatabaseStateMonitor (UnitMonitor)

Данный монитор проверяет, синхронизировано ли зеркальное отображение база данных.

Knowledge Base article:

Сводка

Этот монитор проверяет состояние зеркального отображения базы данных в Microsoft® SQL Server™. Это выполняется путем отправки запроса к базе данных master экземпляра SQL Server и возвращения сведений о состоянии зеркального отображения базы данных. При получении предупреждения от этого монитора необходимо предпринять действия по возврату зеркального отображения базы данных в рабочее состояние.

Причины

Неисправное состояние указывает на текущую недоступность зеркала базы данных SQL Server™. Все состояния, за исключением состояния SYNCHRONIZED, соответствуют неработоспособному состоянию. Возможные состояния описаны ниже.:

Состояние зеркального отображения базы данных SQL

Описание

Состояние работоспособности MOM

SYNCHRONIZED

Когда зеркальный сервер добивается такого же состояния базы данных, как на основном сервере, состояние зеркального отображения меняется на SYNCHRONIZED. База данных остается в этом состоянии, пока основной сервер продолжает отправлять изменения на зеркальный сервер, а тот, в свою очередь, продолжает применять эти изменения к зеркальной базе данных.

Если установлено значение FULL безопасности транзакций, в состоянии SYNCHRONIZED поддерживается как автоматическая, так и ручная отработка отказа , и после отработки отказа не происходит потери данных.

Если безопасность транзакций отключена, всегда возможна потеря данных, даже в состоянии SYNCHRONIZED.

РАБОТОСПОСОБНА

SYNCHRONIZING

Содержимое зеркальной базы данных отстает от содержимого основной базы данных. Основной сервер отправляет записи журнала на зеркальный сервер, который применяет эти изменения к зеркальной базе данных для выполнения наката.

В начале сеанса зеркального отображения базы данных она находится в состоянии SYNCHRONIZING. Основной сервер обрабатывает базу данных, а зеркальный сервер пытается таким же образом обрабатывать зеркальную базу данных.

ПРЕДУПРЕЖДЕНИЕ

SUSPENDED

Зеркальное отображение базы данных недоступно. Основная база данных запущена, но не отправляет никаких журналов на зеркальный сервер; состояние, называемое выполнением без поддержки, возникает после отработки отказа.

Когда в результате ошибок повтора или действий администратора сеанс временно прекращается, он переходит в состояние SUSPENDED.

SUSPENDED является постоянным состоянием, нечувствительным к завершению работы участников и их запуску.

ПРЕДУПРЕЖДЕНИЕ

PENDING_FAILOVER

Это состояние имеет место только на основном сервере после начала отработки отказа, но до того, как сервер взял на себя роль зеркального.

Если инициируется отработка отказа, основная база данных переходит в состояние PENDING_FAILOVER, немедленно закрывает все пользовательские подключения и берет на себя роль зеркальной базы данных.

ПРЕДУПРЕЖДЕНИЕ

DISCONNECTED

Один участник потерял связь с другим участником.

КРИТИЧЕСКОЕ

Чтобы узнать точное состояние базы данных, проверьте контекст изменения или предупреждения состояния.

Решения

Чтобы решить проблему, попробуйте выполнить следующие действия.:

Переопределяемые параметры

Имя

Описание

Значение по умолчанию

Приоритет предупреждения

Определяет приоритет предупреждения.

Обычные

Серьезность предупреждения

Определяет серьезность предупреждения.

MatchMonitorHealth

Включено

Включает или отключает рабочий процесс.

Да

Создает предупреждения

Определяет, создает ли рабочий процесс предупреждения.

Да

Интервал (в секундах)

Повторяющийся интервал времени в секундах, по истечении которого запускается рабочий процесс.

900

Время синхронизации

Время синхронизации указывается в 24-часовом формате и может быть опущено.

 

Время ожидания (в секундах)

Определяет время, в течение которого возможно выполнение рабочего процесса перед закрытием и пометкой как сбойный.

300

Element properties:

TargetMicrosoft.SQLServer.2016.Mirroring.Database
Parent MonitorSystem.Health.AvailabilityState
CategoryAvailabilityHealth
EnabledTrue
Alert GenerateTrue
Alert SeverityMatchMonitorHealth
Alert PriorityNormal
Alert Auto ResolveTrue
Monitor TypeMicrosoft.SQLServer.2016.Mirroring.ScriptedThreeStateType
RemotableTrue
AccessibilityPublic
Alert Message
Зеркальное отображение базы данных не синхронизировано
Зеркальное отображение базы данных "{0}" в экземпляре SQL Server "{1}" на компьютере "{2}" имеет состояние "{3}".
RunAsMicrosoft.SQLServer.MonitoringAccount

Source Code:

<UnitMonitor ID="Microsoft.SQLServer.2016.Mirroring.DatabaseStateMonitor" Accessibility="Public" Enabled="true" Target="SQL2016Mirroring!Microsoft.SQLServer.2016.Mirroring.Database" ParentMonitorID="Health!System.Health.AvailabilityState" TypeID="Microsoft.SQLServer.2016.Mirroring.ScriptedThreeStateType" Remotable="true" Priority="Normal" ConfirmDelivery="false" RunAs="GPMP!Microsoft.SQLServer.MonitoringAccount">
<Category>AvailabilityHealth</Category>
<AlertSettings AlertMessage="Microsoft.SQLServer.2016.Mirroring.DatabaseStateMonitor.AlertMessage">
<AlertOnState>Warning</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>Normal</AlertPriority>
<AlertSeverity>MatchMonitorHealth</AlertSeverity>
<AlertParameters>
<AlertParameter1>$Target/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.Database"]/DatabaseName$</AlertParameter1>
<AlertParameter2>$Target/Host/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.ServerRole"]/InstanceName$</AlertParameter2>
<AlertParameter3>$Target/Host/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</AlertParameter3>
<AlertParameter4>$Data/Context/Property[@Name='$Target/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.Database"]/DatabaseName$-State']$</AlertParameter4>
</AlertParameters>
</AlertSettings>
<OperationalStates>
<OperationalState ID="Good" MonitorTypeStateID="Good" HealthState="Success"/>
<OperationalState ID="NeitherGoodNorBad" MonitorTypeStateID="NeitherGoodNorBad" HealthState="Warning"/>
<OperationalState ID="Bad" MonitorTypeStateID="Bad" HealthState="Error"/>
</OperationalStates>
<Configuration>
<ScriptName>GetSQL2016MirroredDBState.vbs</ScriptName>
<ScriptBody><Script>'#Include File:GetSQL2016MirroredDBState.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 = 4211

Dim GetDatabasesStatusQuery
GetDatabasesStatusQuery = "SELECT " &amp;_
" d.name, " &amp;_
" dm.mirroring_state_desc " &amp;_
" FROM sys.databases d " &amp;_
" INNER JOIN sys.database_mirroring dm ON dm.database_id = d.database_id " &amp;_
" WHERE dm.mirroring_guid IS NOT NULL"

Call GetDBHealth()

Sub GetDBHealth()
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 = DBHealth(WScript.Arguments(0), oBag, WScript.Arguments(1), WScript.Arguments(2), WScript.Arguments(3))
Call oAPI.Return(oBag)
Call GlobalErrorListToEventLog()
Else
Wscript.Quit()
End If
End Sub

Function DBHealth(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
DBHealth = SQL_MONITORING_CONNECT_FAILURE
Exit Function
End If

Dim oResults
e.Clear
On Error Resume Next
Set oResults = cnADOConnection.Execute(GetDatabasesStatusQuery)
e.Save
On Error Goto 0
If e.Number &lt;&gt; 0 Then
DBHealth = SQL_MONITORING_QUERY_FAILURE
ThrowScriptErrorNoAbort "Query execution failed", 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) &amp; "-State", CStr(oResults(1)))
oResults.MoveNext
Loop

cnADOConnection.Close
DBHealth = SQL_MONITORING_SUCCESS
End Function
</Script></ScriptBody>
<IntervalSeconds>900</IntervalSeconds>
<SyncTime/>
<TimeoutSeconds>300</TimeoutSeconds>
<ConnectionString>$Target/Host/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.DBEngine"]/ConnectionString$</ConnectionString>
<GoodExpression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="String">Property[@Name='$Target/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.Database"]/DatabaseName$-State']</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="String">SYNCHRONIZED</Value>
</ValueExpression>
</SimpleExpression>
</GoodExpression>
<NeitherGoodNorBadExpression>
<Or>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="String">Property[@Name='$Target/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.Database"]/DatabaseName$-State']</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="String">SYNCHRONIZING</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="String">Property[@Name='$Target/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.Database"]/DatabaseName$-State']</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="String">UNSYNCHRONIZED</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="String">Property[@Name='$Target/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.Database"]/DatabaseName$-State']</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="String">PENDING_FAILOVER</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="String">Property[@Name='$Target/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.Database"]/DatabaseName$-State']</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="String">SUSPENDED</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
</Or>
</NeitherGoodNorBadExpression>
<BadExpression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="String">Property[@Name='$Target/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.Database"]/DatabaseName$-State']</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="String">DISCONNECTED</Value>
</ValueExpression>
</SimpleExpression>
</BadExpression>
</Configuration>
</UnitMonitor>