web-dev-qa-db-fra.com

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

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?

21
brett rogers

Si vous utilisez SQL 2005+ et que vous 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 d'état régulièrement. Pour plus d'informations sur le DMV sys.databases, voir la documentation ici: http://msdn.Microsoft.com/en-us/library/ms178534.aspx

12
AndrewSQL

J'utiliserais le plus récent sys.databases pas 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)
9
gbn

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 statut 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 va être supprimée dans les futures versions, donc databasepropertyex la remplace.

2
Marian

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.

2
Ben Thul

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
1
isxaker