Chcę mieć możliwość uruchomienia zapytania, aby uzyskać kluczowe informacje o stanie bazy danych. Tzn. Chcę, aby zapytanie mogło stwierdzić, czy baza danych jest w dobrym stanie, czy nie.
Oto zapytanie, które odziedziczyłem dla tej kontroli:
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)
Jeśli to zapytanie zwraca jakiekolwiek wyniki, przyjmuje się, że baza danych jest w stanie podejrzanym lub potencjalnie złym.
Czy jest na to lepszy sposób?
sql-server
sql-server-2008
Brett Rogers
źródło
źródło
Odpowiedzi:
Jeśli używasz SQL 2005+ i chcesz tylko zwrócić nazwę DB, gdy DB nie jest w stanie „ONLINE” użyłbym tego:
Pamiętaj, że bazy danych uczestniczące w dublowaniu lub wysyłaniu dziennika nie będą dostępne online lub mogą regularnie zmieniać stan. Aby uzyskać więcej informacji na temat sys.databases DMV, zobacz dokumentację tutaj: http://msdn.microsoft.com/en-us/library/ms178534.aspx
źródło
Używałbym nowszych sys.dat baz danych nie sydat baz danych, ale w przeciwnym razie jest to OK
Ponadto nie potrzebujesz połączeń DATABASEPROPERTY
źródło
sposobem, w jaki znalazłem status db, jest użycie funkcji DATABASEPROPERTYEX (baza danych, właściwość), jak poniżej:
WYBIERZ DATABASEPROPERTYEX („AdventureWorks”, „Status”).
Statusy są dość oczywiste:
ONLINE = Baza danych jest dostępna dla zapytania.
OFFLINE = Baza danych została jawnie przełączona w tryb offline.
RESTORING = Baza danych jest przywracana.
ODZYSKIWANIE = Baza danych jest odtwarzana i nie jest jeszcze gotowa na zapytania.
SUSPECT = Baza danych nie została odzyskana.
EMERGENCY = Baza danych znajduje się w stanie awaryjnym, tylko do odczytu. Dostęp jest ograniczony do członków sysadmin
Na blogu Oli Hallengren (SQL MVP), w swoim narzędziu do weryfikacji integralności bazy danych, znalazłem, że używa widoku sys.database_recovery_status do zapytania o status bazy danych. Jeśli db ma wiersz w tym widoku, oznacza to, że jest aktywny i kopie, jeśli nie, jest offline.
PS: funkcja bazy danych, której używasz, zostanie usunięta w przyszłych wersjach, więc databasepropertyex ją zastępuje.
źródło
Zamiast zapytać o określone warunki, rzuciłbym okiem na wszystko w sys.databases, gdzie state_desc <> 'ONLINE'. Ponadto, w zależności od tego, co chcesz zrobić, has_dbaccess może generować fałszywe alarmy.
źródło
Podoba mi się ten:
źródło