Quando o banco de dados do SQL Server está pronto para aceitar consultas?

11

No arquivo de log de erros do SQL Server, encontrei as seguintes linhas:

2018-02-22 14:10:58.95 spid17s     Starting up database 'msdb'.
2018-02-22 14:10:58.95 spid16s     Starting up database 'ReportServer'.
2018-02-22 14:10:58.95 spid18s     Starting up database 'ReportServerTempDB'.
2018-02-22 14:10:58.95 spid19s     Starting up database 'XYZ'.

Se eu verificar o status do banco de dados XYZ antes dessa hora, ele estará ONLINEusando a seguinte instrução:

SELECT state_desc FROM sys.databases WHERE name='XYZ'

... mas quando tento me conectar a esse banco de dados usando um aplicativo C #, ele não pode se conectar ao banco de dados.

O erro é:

Falha no login para o usuário 'asd'.
Motivo: falha ao abrir o banco de dados especificado explicitamente.

Tentei três usuários diferentes (usuário do Windows, sa, usuário do SQL Server definido para o aplicativo). O problema ocorre quando eu executo o aplicativo na inicialização do sistema operacional, mas se eu iniciá-lo manualmente após a inicialização, nenhum erro ocorre, então acho que todas as configurações do SQL Server e do firewall estão corretas.

Também verifiquei antes se o status do serviço está sendo executado.

O que mais devo verificar para garantir que o banco de dados esteja realmente online e pronto para consultas?

Estou procurando uma chave que me diga que está ok para consultar o banco de dados, em vez de atrasar por um tempo (mesmo que não seja por um motivo claro).

Pensei em verificar o log de erros quanto ao texto "Iniciando o banco de dados 'XYZ'", mas isso significa que tenho que adicionar uma configuração para o aplicativo ao caminho do log de erros do SQL Server. Também significa ler o arquivo várias vezes até encontrar essa frase.

Ahmed
fonte

Respostas:

23

O banco de dados do SQL Server está pronto para aceitar consultas assim que:

SELECT DATABASEPROPERTYEX(N'database name', 'Collation')

não retorna NULL.

Na documentação para DATABASEPROPERTYEX(Transact-SQL) :

Nota: O ONLINEstatus pode ser retornado enquanto o banco de dados está sendo aberto e ainda não foi recuperado. Para identificar quando um banco de dados pode aceitar conexões, consulte a propriedade Collation de DATABASEPROPERTYEX. O banco de dados pode aceitar conexões quando o agrupamento do banco de dados retorna um valor não nulo. Para bancos de dados Always On, consulte database_stateou database_state_desccolunas de sys.dm_hadr_database_replica_states.

Paul White 9
fonte
3

Os bancos de dados do SQL Server são inicializados, mas precisam analisar o log de transações para rolar as transações para frente e para trás. Esse processo pode levar de milissegundos a horas (até dias!) No caso de uma transação de longa execução, muitos (pense milhares) de bancos de dados do usuário ou bancos de dados com muitos (pense dezenas de milhares) de arquivos de log virtuais.

Se você deseja que o aplicativo entre apenas quando a recuperação estiver concluída e o banco de dados estiver pronto, faça com que o aplicativo tente novamente sua conexão.

Se você deseja que o aplicativo possa entrar no SQL Server imediatamente, mas talvez ainda não consiga executar nenhuma consulta, defina seu banco de dados padrão como TempDB em vez de um banco de dados do usuário. Provavelmente estará on-line imediatamente, mesmo quando os bancos de dados do usuário não estiverem disponíveis.

Brent Ozar
fonte