it-swarm.it

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

Voglio essere in grado di eseguire una query per ottenere le informazioni cruciali sullo stato di un database. Ad esempio, 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?

21
brett rogers

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 database DMV sys.d.d. consultare la documentazione qui: http://msdn.Microsoft.com/en-us/library/ms178534.aspx

12
AndrewSQL

Vorrei utilizzare il più recente database sys non database syd 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)
9
gbn

il modo in cui ho trovato 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

In 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.

2
Marian

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.

2
Ben Thul

Mi piace questa:

SELECT name, state_desc 
FROM   sys.databases

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