Minha empresa tem uma ferramenta que monitora o status de servidores, serviços, bancos de dados etc. Monitoramos vários servidores locais para nossos clientes. Uma verificação simples específica realizada é determinar se um banco de dados do SQL Server está em um estado 'bom' consultando o valor de determinadas propriedades do banco de dados. As quatro propriedades do banco de dados que monitoramos são:
- é suspeito
- Está offline
- IsEmergencyMode
- está desligado
Esta é a consulta que usamos:
SELECT name AS [SuspectDB],
DATABASEPROPERTY(name, N'IsSuspect') AS [Suspect],
DATABASEPROPERTY(name, N'IsOffline') AS [Offline],
ISNULL(DATABASEPROPERTY(name, N'IsShutdown'), 1) AS [Shutdown],
DATABASEPROPERTY(name, N'IsEmergencyMode') AS [Emergency]
FROM sysdatabases
WHERE (DATABASEPROPERTY(name, N'IsSuspect') = 1)
OR (DATABASEPROPERTY(name, N'IsOffline') = 1)
OR (ISNULL(DATABASEPROPERTY(name, N'IsShutdown'), 1) = 1)
OR (DATABASEPROPERTY(name, N'IsEmergencyMode') = 1)
Ao testar uma atualização para o SQL Server 2008, parece que alguns de nossos bancos de dados estão retornando um valor 1 (verdadeiro) para a propriedade IsShutdown . Isso nunca foi o caso anteriormente com o SQL Server 2005. A documentação do MSDN para a propriedade simplesmente declara "O banco de dados encontrou um problema na inicialização".
Tanto quanto eu posso dizer, os bancos de dados estão perfeitamente bem. Eles estão ativos, podem ser consultados, etc. Sem problemas.
A propriedade IsShutdown realmente importa para meus propósitos de monitoramento, ou seja, indica que o banco de dados está em um estado ruim? Ou devo apenas removê-lo da minha consulta?
NOTA: Conversando com um de nossos DBAs residentes, eles descobriram que em alguns de nossos novos bancos de dados SQL Server 2008, o fato de a propriedade IsAutoClose estar habilitada pode ter algo a ver com o motivo desses bancos de dados terem um IsShutdown igual a true. Desativar o IsAutoClose parece "consertar" o IsShutdown sendo verdadeiro.
Uma prática melhor pode ser examinar o status do banco de dados em sys.databases ou sysdatabases. Se o status não for 0, provavelmente há um problema (a menos que você esteja usando espelhamento, envio de log, etc. onde o status do banco de dados não deveria ser 0).
Ok, depois de muita investigação sobre isso, esta é a minha conclusão:
Breve história: a propriedade IsShutdown não é importante para monitorar o status dos meus bancos de dados. Mesmo quando definido como True, o banco de dados ainda está em bom estado.
Longa história: a definição do MSDN para a propriedade IsShutdown está incorreta. Lê-se:
Essa definição não faz muito sentido dado o nome da propriedade. Na prática, a propriedade IsShutdown parece estar diretamente relacionada à propriedade IsAutoClose. Se o fechamento automático tiver encerrado corretamente o banco de dados depois que nenhuma conexão estiver mais ativa, IsShutdown será definido como True. Uma vez que o banco de dados gira de volta (por assim dizer), IsShutdown é definido de volta para False.
Essa teoria é apoiada pelo fato de que existe uma coluna is_cleanly_shutdown em sys.databases. O valor dessa coluna é sempre igual ao valor de IsShutdown, ou seja, são iguais.
A definição incorreta da propriedade é provavelmente o que fez com que o desenvolvedor do qual herdei essa consulta a incluísse em sua verificação de status do banco de dados. Agora removi a verificação dessa propriedade da consulta.
Acho que você pode ter respondido sua própria pergunta com a nota sobre AutoClose. Uma coisa que acho estranho é que você está verificando essas propriedades por meio da exibição de compatibilidade (sysdatabases) em vez de obter o status por meio da exibição do sistema (sys.databases). Existe uma razão específica para isso? Meu palpite é que você ainda oferece suporte a instâncias SQL 2000, mas, caso contrário, talvez queira atualizar seu código de monitoramento para aproveitar todos os dados disponíveis nas exibições do sistema SQL 2005+.
Para um desempenho um pouco melhor, considere desativar o fechamento automático, a menos que você tenha um grande número de bancos de dados no sistema e realmente precise recuperar os recursos.