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?
sql-server
sql-server-2008
brett rogers
fonte
fonte
Respostas:
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:
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
fonte
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
fonte
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á.
fonte
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.
fonte
Eu gosto deste:
fonte