Welche Abfrage eignet sich am besten zum Überwachen des Status einer SQL Server-Datenbank?


20

Ich möchte in der Lage sein, eine Abfrage auszuführen, um die entscheidenden Informationen zum Status einer Datenbank abzurufen. Das heißt, ich möchte, dass die Abfrage erkennen kann, ob sich die Datenbank in einem guten Zustand befindet oder nicht.

Dies ist die Abfrage, die ich für diese Prüfung geerbt habe:

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)

Wenn diese Abfrage Ergebnisse liefert, wird davon ausgegangen, dass sich die Datenbank in einem verdächtigen oder möglicherweise schlechten Zustand befindet.

Gibt es einen besseren Weg, dies zu tun?


Wenn Sie in mehr in der Tiefen Gesundheitschecks interessiert sind, möchten Sie vielleicht einige der wichtigeren WMI - Leistungsindikatoren wie Deadlocks, Disk - IO Wartezeit, Transaktionen pro Sekunde überwachen usw.

@RQDC - Wenn Sie in SQL Server 2008 unterwegs sind, ist es wahrscheinlich einfacher, das Management Datawarehouse einzurichten.

@ Brett Rogers - "Best / Good" gelten als subjektive Fragen. Bitte umformulieren.
CoderHawk

Bitte machen Sie einen Vorschlag zur Neuphrase und ich werde ihn gerne in Betracht ziehen. Ich suche "best" wie in "best practice". Scheint der richtige Weg zu sein, es für mich auszudrücken.
Brett Rogers

@brett - na ja!
Ich bin

Antworten:


12

Wenn Sie SQL 2005+ verwenden und nur den DB-Namen zurückgeben möchten, in dem sich der DB nicht im Status "ONLINE" befindet, würde ich Folgendes verwenden:

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

Denken Sie daran, dass Datenbanken, die an der Spiegelung oder dem Protokollversand teilnehmen, nicht online sind oder ihren Status regelmäßig ändern können. Weitere Informationen zu DMV sys.databases finden Sie in der Dokumentation hier: http://msdn.microsoft.com/en-us/library/ms178534.aspx


9

Ich würde die neueren sys.databases verwenden, nicht die sydatabases, aber sonst ist das in Ordnung

Nicht zuletzt benötigen Sie keine DATABASEPROPERTY-Aufrufe

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

2

Die Art und Weise, wie ich den DB-Status gefunden habe, besteht darin, die Funktion DATABASEPROPERTYEX (Datenbank, Eigenschaft) wie folgt zu verwenden:

SELECT DATABASEPROPERTYEX ('AdventureWorks', 'Status').

Die Status sind ziemlich selbsterklärend:

ONLINE = Datenbank steht zur Abfrage zur Verfügung.

OFFLINE = Die Datenbank wurde explizit offline geschaltet.

RESTORING = Datenbank wird wiederhergestellt.

RECOVERING = Die Datenbank wird wiederhergestellt und ist noch nicht für Abfragen bereit.

SUSPECT = Datenbank wurde nicht wiederhergestellt.

EMERGENCY = Die Datenbank befindet sich in einem schreibgeschützten Notfallzustand. Der Zugriff ist auf Sysadmin-Mitglieder beschränkt

In Ola Hallengrens Blog (einem SQL-MVP) habe ich festgestellt, dass er in seinem Tool zur Überprüfung der Datenbankintegrität die Ansicht sys.database_recovery_status verwendet, um einen Datenbankstatus abzufragen. Wenn die Datenbank in dieser Ansicht eine Zeile enthält, ist sie live und munter. Wenn nicht, ist sie offline.

PS: Die Datenbankeigenschaftsfunktion, die Sie verwenden, wird in zukünftigen Versionen entfernt, sodass die Datenbankeigenschaftex sie ersetzt.


Ich glaube nicht, dass der Fragesteller nach bestimmten Wiederherstellungsinformationen gesucht hat, sondern nach einer Abfrage für eine allgemeine Gesundheitsüberprüfung. sys.databases ist der bessere Ort, um den Datenbankstatus zu ermitteln, vorausgesetzt, Sie verfügen über ausreichende Berechtigungen, um Offlinedatenbanken anzuzeigen. Wenn es sich nicht in sys.databases befindet, wird es gelöscht oder getrennt.
AndrewSQL

1
Ja, ich weiß, was Sie meinen, aber ich sagte, dass er nur überprüfte, ob die Datenbank in dieser Ansicht vorhanden ist, wenn ja, dann behandelte er die Datenbank als zugänglich, wenn nicht, behandelte er die Datenbank als unzugänglich. Das kann also eine zweite Prüfung sein :). Für mich wäre ein guter Start-Health-Check, eine einzelne kleine Tabelle aus dieser Datenbank abzufragen. Wenn diese Abfrage Daten zurückgibt, würde ich die Datenbank als auf den ersten Blick zugänglich betrachten.
Marian

2

Anstatt nach bestimmten Bedingungen zu fragen, würde ich mir alles in sys.databases ansehen, wo state_desc <> 'ONLINE'. Außerdem kann has_dbaccess, je nachdem, was Sie tun möchten, einige falsche Positive auslösen.


0

Ich mag dieses:

SELECT name, state_desc 
FROM   sys.databases

name                            state_desc
------------------------------- ----------------
master                          ONLINE
tempdb                          ONLINE
model                           ONLINE
msdb                            ONLINE
TestTableDatabase2005           RECOVERY_PENDING
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.