Qual è la query migliore da utilizzare per monitorare lo stato di un database SQL Server?


20

Voglio essere in grado di eseguire una query per ottenere le informazioni cruciali sullo stato di un database. Vale a dire, voglio che la query sia in grado di dire se il database è in buono stato.

Questa è la query che ho ereditato per questo controllo:

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)

Se la query restituisce risultati, si presuppone che il database si trovi in ​​uno stato sospetto o potenzialmente non valido.

C'è un modo migliore per farlo?


Se sei interessato a controlli di

@RQDC - Se stai andando in fondo a SQL Server 2008, probabilmente è più facile impostare il Datawarehouse di gestione.

@brett rogers - 'Best / Good' sono considerate domande soggettive. Si prega di riformulare.
CoderHawk,

Fornisci un suggerimento su come riformulare e lo considererò volentieri. Sto cercando "best" come in "best practice". Sembra il modo corretto di dirmelo.
Brett Roger Roger

@brett - beh! felice di aver ottenuto il "migliore" :)
CoderHawk

Risposte:


12

Se si utilizza SQL 2005+ e si desidera restituire solo il nome del DB in cui il DB non si trova nello stato "ONLINE", utilizzare questo:

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

Ricorda che i database che partecipano al mirroring o al log shipping non saranno online o potrebbero cambiare regolarmente stato. Per ulteriori informazioni sul DMV sys.database, consultare la documentazione qui: http://msdn.microsoft.com/en-us/library/ms178534.aspx


9

Vorrei utilizzare i più recenti sys.database non syd Database ma per il resto va bene

Non da ultimo, non hai bisogno di chiamate DATABASEPROPERTY

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

2

il modo in cui ho scoperto di vedere lo stato del db è usare la funzione DATABASEPROPERTYEX (database, proprietà), in questo modo:

SELEZIONA DATABASEPROPERTYEX ('AdventureWorks', 'Status').

Gli stati sono piuttosto autoesplicativi:

ONLINE = Il database è disponibile per la query.

OFFLINE = Il database è stato esplicitamente portato offline.

RESTORING = Il database è in fase di ripristino.

RECOVERING = Il database si sta ripristinando e non è ancora pronto per le query.

SUSPECT = Il database non è stato ripristinato.

EMERGENCY = Il database è in uno stato di emergenza di sola lettura. L'accesso è limitato ai membri di amministratore di sistema

Nel blog di Ola Hallengren (un MVP SQL), nel suo strumento per verificare l'integrità del database, ho scoperto che sta usando la vista sys.database_recovery_status per interrogare uno stato db. Se il db ha una riga in questa vista, allora è live e kick, in caso contrario, è offline.

PS: la funzione databaseproperty che utilizzerai verrà rimossa nelle versioni future, quindi databasepropertyex la sta sostituendo.


Non credo che il richiedente cercasse informazioni specifiche sul recupero, ma piuttosto una query per un controllo generale dello stato. sys.d Database è il posto migliore per trovare lo stato del db, supponendo che tu sia in esecuzione con privilegi sufficienti per vedere i database offline. Se non si trova nei database sys, viene eliminato o rimosso.
AndrewSQL,

1
Sì, so cosa intendi, ma ho detto che stava solo controllando se il db esiste in quella vista, se sì, che ha trattato il database come accessibile, altrimenti ha trattato il db come inaccessibile. Quindi questo può essere un secondo controllo :). Per me, un buon controllo di integrità iniziale sarebbe quello di interrogare qualsiasi singola piccola tabella da quel db e se quella query restituisce dati, considererei il db accessibile a prima vista.
Marian,

2

Anziché eseguire una query per condizioni specifiche, darei un'occhiata a qualsiasi cosa nei database sys. Dove state_desc <> 'ONLINE'. Inoltre, a seconda di cosa stai cercando di fare, has_dbaccess potrebbe generare alcuni falsi positivi.


0

Mi piace questo:

SELECT name, state_desc 
FROM   sys.databases

name                            state_desc
------------------------------- ----------------
master                          ONLINE
tempdb                          ONLINE
model                           ONLINE
msdb                            ONLINE
TestTableDatabase2005           RECOVERY_PENDING
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.