Je veux pouvoir exécuter une requête pour obtenir les informations cruciales sur l'état d'une base de données. C'est-à-dire que je veux que la requête puisse dire si la base de données est en bon état ou non.
Voici la requête dont j'ai hérité pour cette vérification:
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 cette requête renvoie des résultats, l'hypothèse posée est que la base de données est dans un état suspect ou potentiellement mauvais.
Y a-t-il une meilleure manière de faire cela?
sql-server
sql-server-2008
brett rogers
la source
la source
Réponses:
Si vous utilisez SQL 2005+ et souhaitez uniquement renvoyer le nom de la base de données là où la base de données n'est pas dans l'état "EN LIGNE", j'utiliserais ceci:
N'oubliez pas que les bases de données participant à la mise en miroir ou à l'envoi de journaux ne seront pas en ligne ou peuvent changer régulièrement d'état. Pour plus d'informations sur le DMV sys.databases, consultez la documentation ici: http://msdn.microsoft.com/en-us/library/ms178534.aspx
la source
J'utiliserais les nouvelles sys.databases et non les sydatabases mais sinon c'est OK
Pas moins, vous n'avez pas besoin d'appels DATABASEPROPERTY
la source
la façon dont j'ai trouvé pour voir l'état de la base de données est d'utiliser la fonction DATABASEPROPERTYEX (base de données, propriété), comme ceci:
SELECT DATABASEPROPERTYEX ('AdventureWorks', 'Status').
Les statuts sont assez explicites:
ONLINE = La base de données est disponible pour la requête.
OFFLINE = La base de données a été explicitement mise hors ligne.
RESTORING = La base de données est en cours de restauration.
RECOVERING = La base de données est en cours de récupération et n'est pas encore prête pour les requêtes.
SUSPECT = La base de données n'a pas récupéré.
EMERGENCY = La base de données est en état d'urgence, en lecture seule. L'accès est limité aux membres sysadmin
Dans le blog d'Ola Hallengren (un MVP SQL), dans son outil pour vérifier l'intégrité de la base de données, j'ai trouvé qu'il utilisait la vue sys.database_recovery_status pour interroger un état db. Si la base de données a une ligne dans cette vue, elle est en direct et, sinon, elle est hors ligne.
PS: la fonction databaseproperty que vous utilisez sera supprimée dans les futures versions, donc databasepropertyex la remplace.
la source
Plutôt que de rechercher des conditions spécifiques, je regarderais n'importe quoi dans sys.databases où state_desc <> 'ONLINE'. En outre, selon ce que vous cherchez à faire, has_dbaccess peut générer des faux positifs.
la source
J'aime celui la:
la source