¿Cuál es la mejor consulta para usar para monitorear el estado de una base de datos de SQL Server?

20

Quiero poder ejecutar una consulta para obtener la información crucial sobre el estado de una base de datos. Es decir, quiero que la consulta pueda decir si la base de datos está o no en buen estado.

Esta es la consulta que heredé para esta verificación:

SELECT name AS [SuspectDB],
  DATABASEPROPERTY(name, N'IsSuspect') AS [Suspect],
  DATABASEPROPERTY(name, N'IsOffline') AS [Offline],
  DATABASEPROPERTY(name, N'IsEmergencyMode') AS [Emergency],
  has_dbaccess(name) AS [HasDBAccess]
FROM sysdatabases
WHERE (DATABASEPROPERTY(name, N'IsSuspect') = 1)
   OR (DATABASEPROPERTY(name, N'IsOffline') = 1)
   OR (DATABASEPROPERTY(name, N'IsEmergencyMode') = 1)
   OR (has_dbaccess(name) = 0)

Si esa consulta devuelve algún resultado, se supone que la base de datos está en un estado sospechoso o potencialmente malo.

¿Hay una mejor manera de hacer esto?

Brett Rogers
fuente
Si está interesado en obtener más en profundidad los controles de salud, es posible que desee controlar algunos de los más importantes contadores de rendimiento WMI como interbloqueos, S de disco tiempo de espera, las transacciones por segundo, etc.
@RQDC: si va por el camino en SQL Server 2008, probablemente sea más fácil configurar Management Datawarehouse.
@brett rogers - 'Mejor / Bueno' se consideran preguntas subjetivas. Por favor, reformule.
CoderHawk
Proporcione una sugerencia sobre cómo reformular y con mucho gusto lo consideraré. Estoy buscando "mejor" como en "mejores prácticas". Parece la forma correcta de expresarlo para mí.
brett rogers
@brett - bueno! me alegro de que hayas obtenido el 'mejor' :)
CoderHawk

Respuestas:

12

Si está utilizando SQL 2005+ y solo desea devolver el nombre de la base de datos donde la base de datos no está en el estado "EN LÍNEA", usaría esto:

SELECT
    name
FROM sys.databases
WHERE state != 0;

Recuerde que las bases de datos que participan en la duplicación o el envío de registros no estarán en línea o pueden cambiar de estado regularmente. Para obtener más información sobre el DMV sys.databases, consulte la documentación aquí: http://msdn.microsoft.com/en-us/library/ms178534.aspx

AndrewSQL
fuente
9

Usaría las nuevas sys.databases no sydatabases, pero de lo contrario, esto está bien

No menos importante, no necesita llamadas DATABASEPROPERTY

SELECT
   name, state_desc
FROM
   sys.databases
WHERE
   state IN (4, 5, 6)
gbn
fuente
2

la forma en que encontré para ver el estado de db es usar la función DATABASEPROPERTYEX (base de datos, propiedad), de esta manera:

SELECCIONE DATABASEPROPERTYEX ('AdventureWorks', 'Estado').

Los estados son bastante explicativos:

ONLINE = La base de datos está disponible para consulta.

OFFLINE = La base de datos se desconectó explícitamente.

RESTAURACIÓN = La base de datos se está restaurando.

RECUPERACIÓN = La base de datos se está recuperando y aún no está lista para consultas.

SUSPECT = La base de datos no se recuperó.

EMERGENCIA = La base de datos está en un estado de emergencia de solo lectura. El acceso está restringido a los miembros de sysadmin

En el blog de Ola Hallengren (un MVP de SQL), en su herramienta para verificar la integridad de la base de datos, descubrí que está usando la vista sys.database_recovery_status para consultar un estado de base de datos. Si el DB tiene una fila en esta vista, entonces está en vivo y pateando, si no, está fuera de línea.

PD: la función de propiedad de base de datos que use se eliminará en futuras versiones, por lo que databasepropertyex la reemplazará.

Mariana
fuente
No creo que el autor de la pregunta buscara información de recuperación específica, sino más bien una consulta para un control general de salud. sys.databases es el mejor lugar para encontrar el estado de la base de datos, suponiendo que esté ejecutando con privilegios suficientes para ver bases de datos sin conexión. Si no está en sys.databases, se descarta o se separa.
AndrewSQL
1
Sí, sé a qué te refieres, pero dije que solo estaba comprobando si la base de datos existe en esa vista, en caso afirmativo, trató la base de datos como accesible, si no, trató la base de datos como inaccesible. Entonces esto puede ser una segunda verificación :). Para mí, una buena comprobación de estado inicial sería consultar cualquier tabla pequeña de ese db y si esa consulta devuelve algún dato, consideraría que el db es accesible a primera vista.
Marian
2

En lugar de consultar condiciones específicas, echaría un vistazo a cualquier cosa en sys.databases donde state_desc <> 'ONLINE'. Además, dependiendo de lo que esté buscando hacer, has_dbaccess podría arrojar algunos falsos positivos.

Ben Thul
fuente
0

Me gusta este:

SELECT name, state_desc 
FROM   sys.databases

name                            state_desc
------------------------------- ----------------
master                          ONLINE
tempdb                          ONLINE
model                           ONLINE
msdb                            ONLINE
TestTableDatabase2005           RECOVERY_PENDING
isxaker
fuente