SQL Server 2017 se bloquea al realizar una copia de seguridad porque la ruta de archivo es incorrecta

25

Estaba tratando de restaurar mi base de datos y SQL Server seguía fallando. Recibía un mensaje en SSMS que decía que había un error de transporte de red (la conexión se cortó debido al bloqueo). Revisé los registros y no encontré nada más que SQL Server cerrado inesperadamente. Entonces tendría que ir y reiniciar el servicio.

Reduje el problema al script que la GUI intentaba ejecutar. El problema es cuando se trata de tomar una copia de seguridad del registro de cola, la ruta a los archivos de copia de seguridad es incorrecta. Debería serD:\mapbenefits\...

BACKUP LOG [mapbenefits]
TO  DISK = N'D:mapbenefits_LogBackup_2019-02-21_13-58-24.bak'
WITH NOFORMAT, NOINIT,  NAME = N'mapbenefits_LogBackup_2019-02-21_13-58-24',
    NOSKIP, NOREWIND, NOUNLOAD,  NORECOVERY ,  STATS = 5

Tengo dos preguntas.

  1. ¿Cómo soluciono este camino? Intenté entrar en la configuración del servidor y la ruta de respaldo D:no tiene barra. Si agrego la barra, la interfaz gráfica de usuario lo elimina. Este es SSMS v17.9.1. Puedo elegir D:\mapbenefits\y eso funciona pero quieroD:\DATABASE\...

  2. ¿Es esto un error? ¿Debería bloquearse el servidor SQL solo porque una ruta está mal escrita? Una vez que arreglé la ruta del archivo, no tiene problemas. Puedo reproducirme en cualquier momento simplemente recogiendo la ruta del archivo.

Si ejecuto una consulta para verificar la versión, obtengo CU13, pero si entro en la configuración, veo la versión 14.0.1000.169.

Parece que esto es un error y es reproducible, así que lo publiqué aquí: https://feedback.azure.com/forums/908035-sql-server/suggestions/36920542-incorrect-filepath-with-backup-log-command- causas

Almiar
fuente

Respuestas:

25

Pude reproducir esto.

En 2016, si pongo una ruta no válida como esa, recibo este mensaje:

No se puede abrir el dispositivo de copia de seguridad 'D: mapbenefits_LogBackup_2019-02-21_13-58-24.bak'. Error del sistema operativo 3 (el sistema no puede encontrar la ruta especificada).

En 2017 CU 13 (14.0.3048.4), se produce el bloqueo del servicio. Ya ha mencionado que en la última revisión (14.0.3049.1), el servicio no se bloquea, pero la sesión se cierra.

He confirmado RESTORE DATABASEque también se aplica el mismo comportamiento exacto : pasar una ruta como "D: Copias de seguridad" (con una barra invertida faltante) o "D :: \ Backups" (dos puntos extra) bloquea la instancia de SQL Server (gracias Michael K Campbell por mencionar esto).

Si pongo una ruta "válida" que no existe, obtengo el comportamiento correcto ("no puedo encontrar la ruta especificada") en 2017.

Esto es un error, tanto en CU 13 como en la versión de revisión. Pasar parámetros incorrectos a los comandos BACKUPo RESTOREno debería bloquear el servicio o matar su sesión. Puede informarlo en el sitio de comentarios .

Nota: la versión de este error que bloquea el servicio se puede reproducir en una versión de vista previa pública de SQL Server 2019 (CTP2.2, gracias a Denis Rubashkin por señalar esto)


Mirando esto en un depurador, parece que el código de validación de ruta simplemente está roto. Termina causando un desbordamiento de la pila al llamar de forma recursiva sqlmin!CheckFileStreamReserveddespués de que las comprobaciones normales (y bastante extensas) en la ruta suministrada no tienen sentido. El desbordamiento de la pila hace caer el servicio en la compilación 3048. Lo mismo sucede en 3049, excepto que una secuencia de violaciones de acceso al intentar manejar el desbordamiento de la pila interrumpe la conexión en lugar de detener todo el servidor.


Se lanzó una solución para este error en SQL Server 2017 CU 15:

REVISIÓN: SQL Server 2017 se bloquea debido al desbordamiento de la pila cuando intenta realizar una copia de seguridad del maestro de la base de datos en el disco

El problema también se resuelve en SQL Server 2019 CTP 3.0.

Josh Darnell
fuente