it-swarm-eu.dev

Jaký je nejlepší dotaz pro sledování stavu databáze serveru SQL?

Chci mít možnost spustit dotaz a získat tak zásadní informace o stavu databáze. I.e., chci, aby dotaz mohl říct, zda je databáze v dobrém stavu.

Toto je dotaz, který jsem zdědil za tuto kontrolu:

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)

Pokud dotaz vrátí nějaké výsledky, předpokládá se, že databáze je v podezřelém nebo potenciálně špatném stavu.

Existuje lepší způsob, jak toho dosáhnout?

21
brett rogers

Pokud používáte SQL 2005+ a chcete pouze vrátit název DB tam, kde DB není ve stavu „ONLINE“, použijte tento postup:

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

Nezapomeňte, že databáze účastnící se zrcadlení nebo odesílání protokolu nebudou online nebo se mohou pravidelně měnit. Další informace o DMV sys.databases naleznete v dokumentaci zde: http://msdn.Microsoft.com/en-us/library/ms178534.aspx

12
AndrewSQL

Použil bych novější sys.databases ne sydatabases , ale jinak je to v pořádku

V neposlední řadě nepotřebujete volání DATABASEPROPERTY

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

způsob, jakým jsem zjistil stav db, je použít funkci DATABASEPROPERTYEX (databáze, vlastnost), jako je tato:

VÝBĚR DATABASEPROPERTYEX ('AdventureWorks', 'Status').

Stavy jsou docela samy vysvětlující:

ONLINE = Databáze je k dispozici pro dotaz.

OFFLINE = Databáze byla explicitně offline.

RESTORING = Obnovuje se databáze.

RECOVERING = Databáze se obnovuje a ještě není připravena na dotazy.

SUSPECT = Databáze se neobnovila.

EMERGENCY = Databáze je v nouzovém stavu jen pro čtení. Přístup je omezen na členy sysadmin

V blog Ola Hallengren (SQL MVP) jsem ve svém nástroji k ověření integrity databáze zjistil, že používá dotaz sys.database_recovery_status k dotazu na stav db. Pokud má db v tomto zobrazení řádek, je to živé a kopající, pokud ne, je offline.

PS: funkce databaseproperty, kterou používáte, bude v budoucích verzích odstraněna, takže ji nahradí databasepropertyex.

2
Marian

Místo dotazu na konkrétní podmínky bych se podíval na cokoli v sys.databázích, kde state_desc <> 'ONLINE'. V závislosti na tom, co hledáte, může has_dbaccess také vyvolat falešně pozitivní výsledky.

2
Ben Thul

Líbí se mi tento:

SELECT name, state_desc 
FROM   sys.databases

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