it-swarm.dev

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

Chcę mieć możliwość uruchomienia zapytania, aby uzyskać kluczowe informacje o stanie bazy danych. Tzn. Chcę, aby zapytanie było w stanie 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?

21
brett rogers

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

12
AndrewSQL

Użyłbym nowszej sys.databases not sydatabases , ale w przeciwnym razie jest to OK

Co więcej, nie potrzebujesz połączeń DATABASEPROPERTY

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

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

W blog Ola 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, to 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.

2
Marian

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.

2
Ben Thul

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
1
isxaker