it-swarm.com.de

Was ist die beste Abfrage zum Überwachen des Status einer SQL Server-Datenbank?

Ich möchte in der Lage sein, eine Abfrage auszuführen, um die entscheidenden Informationen über den Status einer Datenbank zu erhalten. 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 zurückgibt, wird davon ausgegangen, dass sich die Datenbank in einem verdächtigen oder möglicherweise fehlerhaften Zustand befindet.

Gibt es einen besseren Weg, dies zu tun?

21
brett rogers

Wenn Sie SQL 2005+ verwenden und nur den DB-Namen zurückgeben möchten, bei dem sich die 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 den Status regelmäßig ändern können. Weitere Informationen zur DMV sys.databases finden Sie in der Dokumentation hier: http://msdn.Microsoft.com/en-us/library/ms178534.aspx

12
AndrewSQL

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

Nicht zuletzt benötigen Sie keine DATABASEPROPERTY-Aufrufe

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

die Art und Weise, wie ich den Datenbankstatus sah, war die Verwendung der Funktion DATABASEPROPERTYEX (Datenbank, Eigenschaft) wie folgt:

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

Die Status sind ziemlich selbsterklärend:

ONLINE = Datenbank kann abgefragt werden.

OFFLINE = 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.

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

In Ola Hallengrens Blog (ein SQL MVP) habe ich in seinem Tool zur Überprüfung der Datenbankintegrität festgestellt, dass er 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 tritt, wenn nicht, ist sie offline.

PS: Die von Ihnen verwendete Datenbank-Eigenschaft wird in zukünftigen Versionen entfernt, daher wird sie von Datenbank-Eigenschaft ersetzt.

2
Marian

Anstatt nach bestimmten Bedingungen zu fragen, würde ich mir alles in sys.databases ansehen, wo state_desc <> 'ONLINE'. Abhängig davon, was Sie tun möchten, kann has_dbaccess auch einige Fehlalarme auslösen.

2
Ben Thul

Ich mag dieses:

SELECT name, state_desc 
FROM   sys.databases

name                            state_desc
------------------------------- ----------------
master                          ONLINE
tempdb                          ONLINE
model                           ONLINE
msdb                            ONLINE
TestTableDatabase2005           RECOVERY_PENDING
1
isxaker