Qual é a melhor consulta a ser usada para monitorar o status de um banco de dados do SQL Server?

20

Quero poder executar uma consulta para obter as informações cruciais sobre o status de um banco de dados. Ou seja, eu quero que a consulta seja capaz de dizer se o banco de dados está ou não em bom estado.

Esta é a consulta que eu herdei para esta verificação:

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 essa consulta retornar algum resultado, pressupõe-se que o banco de dados esteja em um estado suspeito ou potencialmente ruim.

Existe uma maneira melhor de fazer isso?

brett rogers
fonte
Se você estiver interessado em verificações de integridade mais aprofundadas, convém monitorar alguns dos contadores de desempenho WMI mais importantes, como deadlocks, tempo de espera de E / S de disco, transações por segundo etc.
@RQDC - Se você estiver no caminho errado no SQL Server 2008, provavelmente será mais fácil configurar o Management Datawarehouse.
Roger Brett - 'Best / Good' são considerados questões subjetivas. Por favor, refaça a frase.
precisa saber é o seguinte
Forneça uma sugestão sobre como reformular e terei prazer em considerá-la. Estou procurando "melhores" como em "melhores práticas". Parece a maneira correta de expressar isso para mim.
Brett Rogers
@brett - bem! feliz que você tem o 'melhor' :)
CoderHawk

Respostas:

12

Se você estiver usando o SQL 2005+ e quiser retornar apenas o nome do banco de dados onde ele não está no estado "ONLINE", eu usaria isso:

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

Lembre-se de que os bancos de dados que participam do espelhamento ou envio de logs não estarão online ou podem mudar de estado regularmente. Para obter mais informações sobre o DMV do sys.databases, consulte a documentação aqui: http://msdn.microsoft.com/en-us/library/ms178534.aspx

AndrewSQL
fonte
9

Eu usaria os mais recentes sys.databases, não sydatabases, mas, caso contrário, isso está OK

Além disso, você não precisa de chamadas DATABASEPROPERTY

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

a maneira que eu encontrei para ver o status do banco de dados é usar a função DATABASEPROPERTYEX (banco de dados, propriedade), assim:

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

Os status são bastante auto-explicativos:

ONLINE = O banco de dados está disponível para consulta.

OFFLINE = O banco de dados foi explicitamente colocado offline.

RESTORING = Banco de dados está sendo restaurado.

RECOVERING = O banco de dados está se recuperando e ainda não está pronto para consultas.

SUSPECT = O banco de dados não se recuperou.

EMERGÊNCIA = O banco de dados está em estado de emergência, somente leitura. O acesso é restrito aos membros sysadmin

No blog de Ola Hallengren (um MVP do SQL), em sua ferramenta para verificar a integridade do banco de dados, descobri que ele está usando a exibição sys.database_recovery_status para consultar um status de banco de dados. Se o banco de dados tiver uma linha nessa exibição, ele estará ativo e ativo, caso contrário, estará offline.

PS: a função databaseproperty que você usa será removida em versões futuras, portanto o databasepropertyex a substituirá.

Marian
fonte
Eu não acho que o solicitante estava procurando informações específicas de recuperação, mas uma consulta para uma verificação geral de saúde. O sys.databases é o melhor local para encontrar o status do banco de dados, assumindo que você esteja executando privilégios suficientes para ver os bancos de dados offline. Se não estiver no sys.databases, é descartado ou desanexado.
AndrewSQL 19/01
11
Sim, eu sei o que você quer dizer, mas eu disse que ele estava apenas verificando se o banco de dados existe nessa exibição; se sim, ele tratou o banco de dados como acessível; caso contrário, ele tratou o banco como inacessível. Portanto, isso pode ser uma segunda verificação :). Para mim, uma boa verificação de funcionamento inicial seria consultar uma tabela pequena e única a partir desse banco de dados e, se essa consulta retornar algum dado, consideraria o banco de dados acessível à primeira vista.
Marian
2

Em vez de consultar condições específicas, eu examinaria qualquer coisa nos sys.databases onde state_desc <> 'ONLINE'. Além disso, dependendo do que você deseja fazer, o has_dbaccess pode gerar alguns falsos positivos.

Ben Thul
fonte
0

Eu gosto deste:

SELECT name, state_desc 
FROM   sys.databases

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