Wann ist die SQL Server-Datenbank bereit, Abfragen anzunehmen?


11

In der SQL Server-Fehlerprotokolldatei habe ich die folgenden Zeilen gefunden:

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

Wenn ich vor diesem Zeitpunkt den Status der Datenbank XYZ überprüfe, wird ONLINEdie folgende Anweisung verwendet:

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

... aber wenn ich versuche, mit einer C # -Anwendung eine Verbindung zu dieser Datenbank herzustellen, kann keine Verbindung zur Datenbank hergestellt werden.

Der Fehler ist:

Anmeldung für Benutzer 'asd' fehlgeschlagen.
Grund: Fehler beim Öffnen der explizit angegebenen Datenbank.

Ich habe drei verschiedene Benutzer ausprobiert (Windows-Benutzer, sa, SQL Server-Benutzer, der für die Anwendung definiert wurde). Das Problem tritt auf, wenn ich die Anwendung beim Start des Betriebssystems ausführe. Wenn ich sie jedoch nach dem Start manuell starte, treten keine Fehler auf. Daher denke ich, dass alle SQL Server-Einstellungen und Firewall-Einstellungen korrekt sind.

Ich habe auch vorher überprüft, ob der Dienststatus ausgeführt wird.

Was sollte ich noch überprüfen, um sicherzustellen, dass die Datenbank tatsächlich online und für Abfragen bereit ist?

Ich suche nach einem Schlüssel, der mir sagt, dass es in Ordnung ist, die Datenbank abzufragen, anstatt eine Zeit lang zu verzögern (auch nicht aus einem klaren Grund).

Ich habe darüber nachgedacht, das Fehlerprotokoll nach dem Text "Starten der Datenbank 'XYZ'" zu durchsuchen. Dies bedeutet jedoch, dass ich für die Anwendung eine Einstellung für den Pfad des SQL Server-Fehlerprotokolls hinzufügen muss. Es bedeutet auch, die Datei viele Male zu lesen, bis ich diesen Satz finde.

Antworten:


23

Die SQL Server-Datenbank ist bereit, Abfragen zu akzeptieren, sobald:

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

kommt nicht zurück NULL.

Aus der Dokumentation zu DATABASEPROPERTYEX(Transact-SQL) :

Hinweis: Der ONLINEStatus wird möglicherweise zurückgegeben, während die Datenbank geöffnet und noch nicht wiederhergestellt wird. Fragen Sie die Collation-Eigenschaft von ab, um festzustellen, wann eine Datenbank Verbindungen akzeptieren kann DATABASEPROPERTYEX. Die Datenbank kann Verbindungen akzeptieren, wenn die Datenbanksortierung einen Wert ungleich Null zurückgibt. Fragen Sie für Always On-Datenbanken die Spalten database_stateoder database_state_descvon ab sys.dm_hadr_database_replica_states.


3

SQL Server-Datenbanken werden gestartet, müssen dann jedoch das Transaktionsprotokoll analysieren, um Transaktionen vorwärts und rückwärts zu rollen. Dieser Vorgang kann im Falle einer lang laufenden Transaktion, vieler (denken Sie Tausende) Benutzerdatenbanken oder Datenbanken mit vielen (denken Sie Zehntausende) virtuellen Protokolldateien von Millisekunden bis Stunden (sogar Tagen!) Dauern.

Wenn Sie möchten, dass die App erst nach Abschluss der Wiederherstellung eingeht und die Datenbank bereit ist, lassen Sie die Anwendung ihre Verbindung wiederholen.

Wenn Sie möchten, dass die App sofort in SQL Server zugreifen kann , aber möglicherweise noch keine Abfragen ausführen kann, setzen Sie ihre Standarddatenbank auf TempDB anstelle einer Benutzerdatenbank. Es wird wahrscheinlich sofort online sein, selbst wenn Benutzerdatenbanken nicht verfügbar sind.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.