it-swarm.com.de

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

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, lautet sie ONLINE mit der folgenden Anweisung:

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.

11
Ahmed

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

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

gibt nicht NULL zurück.

Aus der Dokumentation zu DATABASEPROPERTYEX (Transact-SQL) :

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

23
Paul White 9

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 bei einer lang laufenden Transaktion, vielen (z. B. Tausenden) Benutzerdatenbanken oder Datenbanken mit vielen (z. B. Zehntausenden) virtuellen Protokolldateien zwischen Millisekunden und Stunden (sogar Tagen!) Dauern.

Wenn Sie möchten, dass die App erst dann eingeht, wenn die Wiederherstellung abgeschlossen ist und die Datenbank bereit ist, lassen Sie die Anwendung ihre Verbindung wiederholen.

Wenn die App sofort in SQL Server gelangen soll , 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.

3
Brent Ozar