Quando il database di SQL Server è pronto per accettare le query?


11

Nel file di registro degli errori di SQL Server ho trovato le seguenti righe:

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 controllo lo stato del database XYZ prima di questo momento, sta ONLINEusando la seguente dichiarazione:

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

... ma quando provo a connettermi a questo database usando un'applicazione C #, non riesco a collegarmi al database.

L'errore è:

Accesso non riuscito per l'utente 'asd'.
Motivo: impossibile aprire il database specificato esplicitamente.

Ho provato tre diversi utenti (utente Windows, sa, utente SQL Server definito per l'applicazione). Il problema si verifica quando eseguo l'applicazione all'avvio del sistema operativo, ma se lo avvio manualmente dopo l'avvio, non si verificano errori, quindi penso che tutte le impostazioni di SQL Server e quelle del firewall siano corrette.

Ho anche verificato prima che lo stato del servizio sia in esecuzione.

Cos'altro devo verificare per accertarmi che il database sia effettivamente online e pronto per le query?

Sto cercando una chiave che mi dica che va bene interrogare il database, invece di ritardare per un certo tempo (anche se non basato su un motivo chiaro).

Ho pensato di scansionare il registro errori per il testo "Avvio del database 'XYZ'", ma ciò significa che devo aggiungere un'impostazione per l'applicazione per il percorso del registro errori di SQL Server. Significa anche leggere il file molte volte fino a quando non trovo questa frase.

Risposte:


23

Il database di SQL Server è pronto per accettare le query non appena:

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

non ritorna NULL.

Dalla documentazione per DATABASEPROPERTYEX(Transact-SQL) :

Nota: lo ONLINEstato può essere restituito durante l'apertura del database e non è stato ancora ripristinato. Per identificare quando un database può accettare connessioni, eseguire una query sulla proprietà Collation di DATABASEPROPERTYEX. Il database può accettare connessioni quando le regole di confronto del database restituiscono un valore non nullo. Per i database Always On, eseguire una query su database_stateo nelle database_state_desccolonne di sys.dm_hadr_database_replica_states.


3

I database di SQL Server si avviano, ma devono quindi analizzare il registro delle transazioni per spostare le transazioni avanti e indietro. Questo processo può richiedere da millisecondi a ore (persino giorni!) In caso di una transazione di lunga durata, molti (pensa a migliaia) di database utente o database con molti (pensa a decine di migliaia) di file di registro virtuali.

Se si desidera che l'app acceda solo al termine del ripristino e il database sia pronto, fare in modo che l'applicazione riprovi la connessione.

Se si desidera che l'app sia in grado di accedere immediatamente a SQL Server, ma che forse non sia ancora in grado di eseguire alcuna query, impostare il database predefinito su TempDB anziché su un database utente. Sarà probabilmente online subito anche quando i database degli utenti non sono disponibili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.