¿Cuándo está lista la base de datos de SQL Server para aceptar consultas?


11

En el archivo de registro de errores de SQL Server encontré las siguientes líneas:

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 verifico el estado de la base de datos XYZ antes de este momento, está ONLINEusando la siguiente declaración:

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

... pero cuando intento conectarme a esta base de datos usando una aplicación C #, no se puede conectar a la base de datos.

El error es:

Error de inicio de sesión para el usuario 'asd'.
Motivo: no se pudo abrir la base de datos especificada explícitamente.

Intenté tres usuarios diferentes (usuario de Windows, sa, usuario de SQL Server definido para la aplicación). El problema ocurre cuando ejecuto la aplicación en el inicio del sistema operativo, pero si la inicio manualmente después del inicio, no se producen errores, por lo que creo que todas las configuraciones de SQL Server y firewall son correctas.

También comprobé antes de esto que el estado del servicio se esté ejecutando.

¿Qué más debo verificar para asegurarme de que la base de datos esté realmente en línea y lista para consultas?

Estoy buscando una clave que me diga que está bien consultar la base de datos, en lugar de retrasarla por un tiempo (aunque no se base en una razón clara).

Pensé en escanear el registro de errores para el texto "Iniciando la base de datos 'XYZ'", pero esto significa que tengo que agregar una configuración para la aplicación para la ruta del registro de errores de SQL Server. También significa leer el archivo muchas veces hasta que encuentre esta frase.

Respuestas:


23

La base de datos de SQL Server está lista para aceptar consultas tan pronto como:

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

no vuelve NULL.

De la documentación para DATABASEPROPERTYEX(Transact-SQL) :

Nota: El ONLINEestado puede devolverse mientras se abre la base de datos y aún no se ha recuperado. Para identificar cuándo una base de datos puede aceptar conexiones, consulte la propiedad Collation de DATABASEPROPERTYEX. La base de datos puede aceptar conexiones cuando la clasificación de la base de datos devuelve un valor no nulo. Para las bases de datos Always On, consulte las columnas database_stateo database_state_descde sys.dm_hadr_database_replica_states.


3

Las bases de datos de SQL Server se inician, pero luego deben analizar el registro de transacciones para avanzar y retroceder. Este proceso puede llevar desde milisegundos hasta horas (¡incluso días!) En el caso de una transacción de larga duración, muchas (piense en miles) de bases de datos de usuarios o bases de datos con muchos (piense en decenas de miles) de archivos de registro virtuales.

Si solo desea que la aplicación entre cuando la recuperación haya finalizado y la base de datos esté lista, haga que la aplicación vuelva a intentar su conexión.

Si desea que la aplicación pueda ingresar a SQL Server de inmediato, pero tal vez no pueda ejecutar ninguna consulta todavía, configure su base de datos predeterminada en TempDB en lugar de una base de datos de usuario. Es probable que esté en línea de inmediato, incluso cuando las bases de datos de los usuarios no estén disponibles.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.