Quelle est la meilleure requête à utiliser pour surveiller l'état d'une base de données SQL Server?

20

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?

brett rogers
la source
Si vous êtes intéressé par des bilans de santé plus approfondis, vous voudrez peut-être surveiller certains des compteurs de performances WMI les plus importants tels que les blocages, le temps d'attente des E / S disque, les transactions par seconde, etc.
@RQDC - Si vous suivez la voie dans SQL Server 2008, il est probablement plus facile de configurer Management Datawarehouse.
@brett rogers - «Meilleur / Bon» sont considérés comme des questions subjectives. Veuillez reformuler.
CoderHawk
Veuillez fournir une suggestion sur la façon de reformuler et je serai ravi d'y réfléchir. Je recherche le "meilleur" comme dans les "meilleures pratiques". Semble comme la bonne façon de me le dire.
brett rogers
@brett - eh bien! heureux d'avoir obtenu le «meilleur» :)
CoderHawk

Réponses:

12

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:

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

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

AndrewSQL
la source
9

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

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

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.

Marian
la source
Je ne pense pas que le demandeur recherchait des informations de récupération spécifiques, mais plutôt une requête pour un bilan de santé général. sys.databases est le meilleur endroit pour trouver l'état de la base de données en supposant que vous exécutez avec des privilèges suffisants pour voir les bases de données hors ligne. S'il ne se trouve pas dans sys.databases, il est supprimé ou détaché.
AndrewSQL
1
Oui, je sais ce que vous voulez dire, mais j'ai dit qu'il vérifiait simplement si la base de données existe dans cette vue, si oui, il a traité la base de données comme accessible, sinon, il a traité la base de données comme inaccessible. Cela peut donc être une deuxième vérification :). Pour moi, un bon bilan de santé de départ serait d'interroger n'importe quelle petite table unique à partir de cette base de données et si cette requête renvoie des données, je considérerais la base de données accessible à première vue.
Marian
2

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.

Ben Thul
la source
0

J'aime celui la:

SELECT name, state_desc 
FROM   sys.databases

name                            state_desc
------------------------------- ----------------
master                          ONLINE
tempdb                          ONLINE
model                           ONLINE
msdb                            ONLINE
TestTableDatabase2005           RECOVERY_PENDING
isxaker
la source