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?
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
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)
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.
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.
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