web-dev-qa-db-fra.com

Quand la base de données SQL Server est-elle prête à accepter des requêtes?

Dans le fichier journal des erreurs SQL Server, j'ai trouvé les lignes suivantes:

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

Si je vérifie l'état de la base de données XYZ avant cette heure, c'est ONLINE à l'aide de l'instruction suivante:

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

... mais lorsque j'essaie de me connecter à cette base de données à l'aide d'une application C #, il ne peut pas se connecter à la base de données.

L'erreur est:

La connexion a échoué pour l'utilisateur "asd".
Motif: Échec de l'ouverture de la base de données explicitement spécifiée.

J'ai essayé trois utilisateurs différents (utilisateur Windows, sa, utilisateur SQL Server défini pour l'application). Le problème se produit lorsque j'exécute l'application au démarrage du système d'exploitation, mais si je la démarre manuellement après le démarrage, aucune erreur ne se produit, donc je pense que tous les paramètres SQL Server et les paramètres du pare-feu sont corrects.

J'ai également vérifié avant cela que l'état du service est en cours d'exécution.

Que dois-je vérifier d'autre pour m'assurer que la base de données est réellement en ligne et prête pour les requêtes?

Je cherche une clé qui me dit que c'est ok pour interroger la base de données, au lieu de retarder pendant un certain temps (même pas basé sur une raison claire).

J'ai pensé à analyser le journal des erreurs pour le texte "Démarrage de la base de données 'XYZ'", mais cela signifie que je dois ajouter un paramètre pour l'application pour le chemin du journal des erreurs SQL Server. Cela signifie également lire le fichier plusieurs fois jusqu'à ce que je trouve cette phrase.

11
Ahmed

La base de données SQL Server est prête à accepter des requêtes dès que:

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

ne renvoie pas NULL.

Dans la documentation de DATABASEPROPERTYEX (Transact-SQL) :

Remarque: le statut ONLINE peut être renvoyé lors de l'ouverture de la base de données et n'est pas encore récupéré. Pour identifier quand une base de données peut accepter des connexions, interrogez la propriété Collation de DATABASEPROPERTYEX. La base de données peut accepter des connexions lorsque le classement de la base de données renvoie une valeur non nulle. Pour les bases de données Always On, interrogez le database_state ou database_state_desc colonnes de sys.dm_hadr_database_replica_states.

23
Paul White 9

Les bases de données SQL Server démarrent, mais elles doivent ensuite analyser le journal des transactions pour faire avancer et reculer les transactions. Ce processus peut prendre de quelques millisecondes à des heures (voire des jours!) En cas de transaction de longue durée, plusieurs (pensez des milliers) de bases de données utilisateur ou des bases de données avec beaucoup (pensez des dizaines de milliers) de fichiers journaux virtuels.

Si vous souhaitez que l'application entre uniquement lorsque la récupération est terminée et que la base de données est prête, demandez à l'application de réessayer sa connexion.

Si vous souhaitez que l'application puisse accéder immédiatement à SQL Server, mais peut-être pas encore en mesure d'exécuter des requêtes, définissez sa base de données par défaut sur TempDB au lieu d'une base de données utilisateur. Il sera probablement en ligne immédiatement, même lorsque les bases de données utilisateur ne sont pas disponibles.

3
Brent Ozar