由于文件路径错误,备份时SQL Server 2017崩溃


25

我试图还原数据库,而SQL Server一直崩溃。我会在SSMS中收到一条消息,说存在网络传输错误(由于崩溃导致连接断开)。我检查了日志,发现没有什么比SQL Server意外关闭更重要。然后,我将不得不重新启动该服务。

我将问题缩小到GUI试图运行的脚本。问题是当进行尾日志备份时,备份文件的路径错误。它应该是D:\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

我有两个问题。

  1. 如何解决此问题?我尝试进入服务器设置,并且备份路径D:没有斜杠。如果我添加斜杠,则gui会将其删除。这是SSMS v17.9.1。我可以选择,D:\mapbenefits\并且可以,但是我想要D:\DATABASE\...

  2. 这是错误吗?SQL服务器是否应该仅由于路径输入错误而崩溃?修复文件路径后,它就没有问题了。我可以随时通过复制文件路径来重现。

如果我运行查询以检查版本,则会得到CU13,但是如果进入设置,则会看到版本14.0.1000.169。

看起来这是一个错误并且可以复制,所以我将其发布到了这里:https : //feedback.azure.com/forums/908035-sql-server/suggestions/36920542-incorrect-filepath-with-backup-log-command-原因

Answers:


25

我能够重现这一点。

在2016年,如果输入这样的无效路径,则会收到以下消息:

无法打开备份设备'D:mapbenefits_LogBackup_2019-02-21_13-58-24.bak'。操作系统错误3(系统找不到指定的路径。)

在2017年CU 13(14.0.3048.4)上,它导致服务崩溃。您已经提到在最新的修补程序(14.0.3049.1)中,服务不会崩溃,但是会话被终止。

我已经确认同样的行为也适用RESTORE DATABASE-传递“ D:Backups”(缺少反斜杠)或“ D :: \ Backups”(冒号)之类的路径会使SQL Server实例崩溃(感谢Michael K Campbell)提出来)。

如果我放置了不存在的“有效”路径,那么我在2017年会得到正确的行为(“找不到指定的路径”)。

这是一个错误-CU 13和修补程序版本中都存在。将错误的参数传递给BACKUPRESTORE命令不应导致服务崩溃终止会话。您可以在反馈站点上报告它。

注意:此错误的服务崩溃版本可以在SQL Server 2019的公共预览版本中复制(CTP2.2-感谢Denis Rubashkin指出了这一点)


在调试器中查看此内容,似乎路径验证代码已被破坏。sqlmin!CheckFileStreamReserved在提供的路径的正常(且相当广泛)的检查无法理解之后,它通过递归调用最终导致堆栈溢出。堆栈溢出导致构建3048上的服务中断。3049发生了相同的事情,只是在尝试处理堆栈溢出时出现一系列访问冲突,但断开了连接,而不是停止整个服务器。


此错误的修复程序已在SQL Server 2017 CU 15中发布:

FIX:SQL Server 2017崩溃由于尝试将数据库主数据库备份到磁盘时的堆栈溢出

此问题在SQL Server 2019 CTP 3.0中也已解决。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.