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?
sql-server
sql-server-2008
Brett Rogers
fuente
fuente
Respuestas:
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:
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
fuente
Usaría las nuevas sys.databases no sydatabases, pero de lo contrario, esto está bien
No menos importante, no necesita llamadas DATABASEPROPERTY
fuente
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á.
fuente
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.
fuente
Me gusta este:
fuente