O SQL Server 2017 trava ao fazer backup porque o caminho do arquivo está errado

25

Eu estava tentando restaurar meu banco de dados e o SQL Server continuou travando. Eu recebia uma mensagem no SSMS informando que havia um erro de transporte de rede (a conexão caiu devido à falha). Verifiquei os logs e não encontrei nada além do SQL Server ser fechado inesperadamente. Eu teria que ir e reiniciar o serviço.

Limitei o problema ao script que a GUI estava tentando executar. O problema é que, quando é necessário fazer um backup do log de cauda, ​​o caminho para os arquivos de backup está errado. Deveria 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

Eu tenho duas perguntas.

  1. Como faço para corrigir esse caminho? Tentei entrar nas configurações do servidor e o caminho do backup é D:sem barra. Se eu adicionar a barra, a GUI a removerá. Este é o SSMS v17.9.1. Eu posso escolher D:\mapbenefits\e isso funciona, mas eu queroD:\DATABASE\...

  2. Isso é um inseto? O servidor SQL deve travar apenas porque um caminho foi digitado incorretamente? Depois de corrigir o caminho do arquivo, não há problemas. Eu posso reproduzir a qualquer momento apenas estragando o caminho do arquivo.

Se eu executar uma consulta para verificar a versão, recebo CU13, mas se eu entrar nas configurações, vejo a versão 14.0.1000.169.

Parece que isso é um bug e é reproduzível, então eu o publiquei aqui: https://feedback.azure.com/forums/908035-sql-server/suggestions/36920542-incorrect-filepath-with-backup-log-command- causas

Rick
fonte

Respostas:

25

Eu era capaz de reproduzir isso.

Em 2016, se eu colocar um caminho inválido como esse, recebo esta mensagem:

Não é possível abrir o dispositivo de backup 'D: mapbenefits_LogBackup_2019-02-21_13-58-24.bak'. Erro do sistema operacional 3 (O sistema não consegue encontrar o caminho especificado.)

No 2017 CU 13 (14.0.3048.4), o serviço falha. Você já mencionou que no hotfix mais recente (14.0.3049.1), o serviço não falha, mas a sessão é interrompida.

Confirmei o mesmo comportamento exato RESTORE DATABASEtambém: passar um caminho como "D: Backups" (com uma barra invertida ausente) ou "D :: \ Backups" (dois pontos extras) trava a instância do SQL Server (obrigado Michael K Campbell por trazer isso à tona).

Se eu colocar um caminho "válido" que não existe, obtenho o comportamento correto ("não é possível encontrar o caminho especificado") em 2017.

Este é um erro - na CU 13 e na compilação do hotfix. Passar parâmetros incorretos para os comandos BACKUPou RESTOREnão deve travar o serviço ou matar sua sessão. Você pode denunciá-lo no site de feedback .

Nota: a versão com falha de serviço desse bug pode ser reproduzida em uma versão de visualização pública do SQL Server 2019 (CTP2.2 - obrigado a Denis Rubashkin por apontar isso)


Observando isso em um depurador, parece que o código de validação de caminho está simplesmente quebrado. Ele acaba causando um estouro de pilha, chamando recursivamente sqlmin!CheckFileStreamReservedapós as verificações normais (e bastante extensas) no caminho fornecido falharem em fazer sentido. O estouro de pilha reduz o serviço na compilação 3048. O mesmo acontece no 3049, exceto uma sequência de violações de acesso ao tentar manipular o estouro de pilha, em vez disso, interrompe a conexão em vez de parar o servidor inteiro.


Uma correção para esse bug foi lançada no SQL Server 2017 CU 15:

CORRECÇÃO: O SQL Server 2017 falha devido ao estouro de pilha ao tentar fazer backup do mestre do banco de dados no disco

O problema também foi resolvido no SQL Server 2019 CTP 3.0.

Josh Darnell
fonte