Jakiego zapytania najlepiej użyć do monitorowania stanu bazy danych SQL Server?

20

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?

Brett Rogers
źródło
Jeśli interesują Cię bardziej szczegółowe kontrole kondycji, możesz monitorować niektóre z ważniejszych liczników wydajności WMI, takie jak zakleszczenia, czas oczekiwania
@RQDC - Jeśli wybierasz się w SQL Server 2008, prawdopodobnie łatwiej będzie skonfigurować Management Datawarehouse.
@brett rogers - „Najlepsze / dobre” są uważane za pytania subiektywne. Proszę ponownie sformułować.
CoderHawk 20.01.11
Podaj sugestię, w jaki sposób sformułować inaczej, a chętnie się zastanowię. Szukam „najlepszego” jak w „najlepszej praktyce”. Wydaje mi się, że to właściwy sposób, by mi to wyrazić.
brett rogers
@brett - cóż! cieszę się, że masz „najlepsze” :)
CoderHawk

Odpowiedzi:

12

Jeśli używasz SQL 2005+ i chcesz tylko zwrócić nazwę DB, gdy DB nie jest w stanie „ONLINE” użyłbym tego:

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

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

AndrewSQL
źródło
9

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

SELECT
   name, state_desc
FROM
   sys.databases
WHERE
   state IN (4, 5, 6)
gbn
źródło
2

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.

Marian
źródło
Nie sądzę, że pytający szukał konkretnych informacji odzyskiwania, ale raczej zapytanie o ogólną kontrolę stanu. sys.databases jest lepszym miejscem do znalezienia statusu db, zakładając, że masz wystarczające uprawnienia do przeglądania baz danych offline. Jeśli nie ma go w sys.databases, jest upuszczany lub odłączany.
AndrewSQL,
1
Tak, wiem, co masz na myśli, ale powiedziałem, że właśnie sprawdzał, czy baza danych istnieje w tym widoku, jeśli tak, to traktował bazę danych jako dostępną, jeśli nie, traktował bazę danych jako niedostępną. To może być druga kontrola :). Dla mnie dobrym początkowym sprawdzeniem kondycji byłoby zapytanie do dowolnej pojedynczej małej tabeli z tego db, a jeśli to zapytanie zwróci jakiekolwiek dane, uznałbym db za dostępny od pierwszego wejrzenia.
Marian
2

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.

Ben Thul
źródło
0

Podoba mi się ten:

SELECT name, state_desc 
FROM   sys.databases

name                            state_desc
------------------------------- ----------------
master                          ONLINE
tempdb                          ONLINE
model                           ONLINE
msdb                            ONLINE
TestTableDatabase2005           RECOVERY_PENDING
isxaker
źródło