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?
sql-server
sql-server-2008
Brett Rogers
quelle
quelle
Antworten:
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:
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
quelle
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
quelle
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.
quelle
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.
quelle
Ich mag dieses:
quelle