Este monitor comprueba si el reflejo de la base de datos está sincronizado.
Este monitor comprueba el estado del reflejo de la base de datos que devuelve Microsoft® SQL Server™. Para ello, se ejecuta una consulta en la base de datos maestra de la instancia de SQL y se devuelve el estado del reflejo de la base de datos. Si recibe una alerta de este monitor, deberá realizar una acción para devolver el reflejo de la base de datos a un estado operativo.
Un estado incorrecto indica que el reflejo de base de datos de SQL Server™ no está disponible actualmente. Todos los estados, excepto el estado SINCRONIZADO, producirán un estado incorrecto. Aquí se enumeran los posibles estados:
Estado del reflejo de SQL Database | Descripción | Estado de mantenimiento de MOM |
SYNCHRONIZED | El estado de creación de reflejo cambia a SYNCHRONIZED cuando el servidor reflejado está suficientemente al día con respecto al servidor principal. La base de datos permanece en este estado mientras el servidor principal continúa con el envío de cambios al servidor reflejado, y el servidor reflejado continúa con la aplicación de los cambios en la base de datos reflejada. Si la seguridad de las transacciones se establece en FULL, se admite la conmutación automática por error y la conmutación manual por error en el estado SYNCHRONIZED; no hay pérdida de datos tras la conmutación por error. Si la seguridad de las transacciones está desactivada, siempre es posible sufrir alguna pérdida de datos, incluso en el estado SYNCHRONIZED. | Correcto |
SYNCHRONIZING | El contenido de la base de datos reflejada está atrasado con respecto al contenido de la base de datos principal. El servidor principal va enviando entradas del registro al servidor reflejado, que está aplicando los cambios a la base de datos reflejada para ponerla al día. Al inicio de una sesión de creación de reflejo de la base de datos, la base de datos se encuentra en el estado SYNCHRONIZING. En este estado, el servidor principal sigue dando servicio a la base de datos, mientras que el reflejado intenta ponerse al día. | ADVERTENCIA |
SUSPENDED | La copia reflejada de la base de datos no está disponible. La base de datos principal se ejecuta sin enviar registros al servidor reflejado, condición conocida como ejecución expuesta. Éste es el estado después de una conmutación por error. Una sesión también puede tener el estado SUSPENDED como resultado de errores al rehacer, o bien si el administrador pone en pausa la sesión. SUSPENDED es un estado persistente que sobrevive a los apagados e inicios de los asociados. | ADVERTENCIA |
PENDING_FAILOVER | Este estado se encuentra solo en el servidor principal después de que se haya iniciado una conmutación por error, pero el servidor todavía no se ha pasado al rol reflejado. Cuando se inicia la conmutación por error, la base de datos principal pasa al estado PENDING_FAILOVER, finaliza rápidamente cualquier conexión de usuario y asume el rol reflejado inmediatamente. | ADVERTENCIA |
DISCONNECTED | El asociado ha perdido la comunicación con el otro asociado. | Crítico |
Para encontrar el estado exacto devuelto para la base de datos, examine el contexto del cambio de estado y de la alerta.
Para solucionar el problema, pruebe lo siguiente:
Asegúrese de que la configuración de la creación de reflejo se haya completado y el proceso de creación de reflejo esté ejecutándose.
Compruebe los vínculos físicos entre los servidores.
Configure las reglas de firewall en el servidor principal y en el servidor reflejado conforme a la configuración de los extremos.
Nombre | Descripción | Valor predeterminado |
Prioridad de alerta | Define la prioridad de la alerta. | Normal |
Gravedad de alerta | Define la gravedad de la alerta. | MatchMonitorHealth |
Habilitado | Habilita o deshabilita el flujo de trabajo. | Sí |
Genera alertas | Define si el flujo de trabajo genera una alerta. | Sí |
Intervalo (segundos) | Intervalo de tiempo periódico en segundos en que se ejecuta el flujo de trabajo. | 900 |
Hora de sincronización | Hora de sincronización especificada en un formato de 24 horas. Se puede omitir. |
|
Tiempo de espera (segundos) | Especifica el tiempo durante el que se puede ejecutar el flujo de trabajo antes de que se cierre y se marque como error. | 300 |
Target | Microsoft.SQLServer.2008.Mirroring.Database | ||
Parent Monitor | System.Health.AvailabilityState | ||
Category | AvailabilityHealth | ||
Enabled | True | ||
Alert Generate | True | ||
Alert Severity | MatchMonitorHealth | ||
Alert Priority | Normal | ||
Alert Auto Resolve | True | ||
Monitor Type | Microsoft.SQLServer.2008.Mirroring.ScriptedThreeStateType | ||
Remotable | True | ||
Accessibility | Public | ||
Alert Message |
| ||
RunAs | Microsoft.SQLServer.SQLProbeAccount |
<UnitMonitor ID="Microsoft.SQLServer.2008.Mirroring.DatabaseStateMonitor" Accessibility="Public" Enabled="true" Target="SQL2008Mirroring!Microsoft.SQLServer.2008.Mirroring.Database" ParentMonitorID="Health!System.Health.AvailabilityState" TypeID="Microsoft.SQLServer.2008.Mirroring.ScriptedThreeStateType" Remotable="true" Priority="Normal" ConfirmDelivery="false" RunAs="SQL!Microsoft.SQLServer.SQLProbeAccount">
<Category>AvailabilityHealth</Category>
<AlertSettings AlertMessage="Microsoft.SQLServer.2008.Mirroring.DatabaseStateMonitor.AlertMessage">
<AlertOnState>Warning</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>Normal</AlertPriority>
<AlertSeverity>MatchMonitorHealth</AlertSeverity>
<AlertParameters>
<AlertParameter1>$Target/Property[Type="SQL!Microsoft.SQLServer.Database"]/DatabaseName$</AlertParameter1>
<AlertParameter2>$Target/Host/Property[Type="SQL!Microsoft.SQLServer.ServerRole"]/InstanceName$</AlertParameter2>
<AlertParameter3>$Target/Host/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</AlertParameter3>
<AlertParameter4>$Data/Context/Property[@Name='$Target/Property[Type="SQL!Microsoft.SQLServer.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>GetSQL2008MirroredDBState.vbs</ScriptName>
<ScriptBody> '#Include File:GetSQL2008MirroredDBState.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 GetDatabasesStatusQuery
GetDatabasesStatusQuery = "SELECT " &_
" d.name, " &_
" dm.mirroring_state_desc " &_
" FROM sys.databases d " &_
" INNER JOIN sys.database_mirroring dm ON dm.database_id = d.database_id " &_
" 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 <> "Running") And (state <> "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)
On Error Resume Next
Call GlobalErrorListToEventLog()
Else
On Error Resume Next
Call GlobalErrorListToEventLog()
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 <> 0 Then
DBHealth = SQL_MONITORING_QUERY_FAILURE
ThrowScriptErrorNoAbort "Query execution failed for '" & sSQLConnectionString & "' SQL Server", e
If (oResults <> null) Then oResults.Close
cnADOConnection.Close
Exit Function
End If
Do While Not oResults.EOF
Call oBag.AddValue(oResults(0) & "-State", CStr(oResults(1)))
oResults.MoveNext
Loop
cnADOConnection.Close
DBHealth = SQL_MONITORING_SUCCESS
End Function
</ScriptBody>
<IntervalSeconds>900</IntervalSeconds>
<SyncTime/>
<TimeoutSeconds>300</TimeoutSeconds>
<ConnectionString>$Target/Host/Property[Type="SQL!Microsoft.SQLServer.DBEngine"]/ConnectionString$</ConnectionString>
<GoodExpression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="String">Property[@Name='$Target/Property[Type="SQL!Microsoft.SQLServer.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="SQL!Microsoft.SQLServer.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="SQL!Microsoft.SQLServer.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="SQL!Microsoft.SQLServer.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="SQL!Microsoft.SQLServer.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="SQL!Microsoft.SQLServer.Database"]/DatabaseName$-State']</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="String">DISCONNECTED</Value>
</ValueExpression>
</SimpleExpression>
</BadExpression>
</Configuration>
</UnitMonitor>