在具有不同扇区大小的HDD上备份数据库

时间:2014-03-17 07:25:08

标签: sql sql-server tsql sql-server-2012 backup

在我们的开发环境中,我们长期以来一直通过各种SQL Server版本和不同的环境配置为我们的每个产品使用特定的备份和恢复脚本。

最近,我们已将SQL Server 2012升级为具有SQL兼容级别2005(90)的标准开发服务器,以维持对旧系统的支持。现在我们发现在一台特定的dev机器上,我们在尝试备份数据库时遇到以下错误:

  

无法使用备份文件'D:\ MyDB.bak',因为它是   最初格式为扇区大小512,现在在设备上   扇区大小4096. BACKUP DATABASE异常终止。

命令为:

BACKUP DATABASE MyDB TO  DISK = N'D:\MyDB.bak' WITH  INIT , NOUNLOAD ,  NAME = N'MyDB backup',  NOSKIP ,  STATS = 10,  NOFORMAT

奇怪的是,该开发者机器上的硬件和分区都没有改变,即使它们的扇区大小不同,这在以前也不是问题。

从我的研究(即谷歌搜索)中除了使用WITH BLOCKSIZE选项的建议之外,在这个问题上没有太多,但这给了我同样的错误信息。

我的查询是:

BACKUP DATABASE MyDB TO  DISK = N'D:\MyDB.bak' WITH  INIT , NOUNLOAD ,  NAME = N'MyDB backup',  NOSKIP ,  STATS = 10,  NOFORMAT, BLOCKSIZE = 4096

有人能说明如何将数据库备份和恢复到不同扇区大小的硬盘吗?

7 个答案:

答案 0 :(得分:28)

您所要做的就是用不同的名称备份。

答案 1 :(得分:21)

此问题是由不同驱动器使用的不同扇区大小引起的。

您可以通过将原始备份命令更改为:

来解决此问题
BACKUP DATABASE MyDB TO  DISK = N'D:\MyDB.bak' WITH  INIT , NOUNLOAD ,  NAME = N'MyDB backup',  STATS = 10,  FORMAT

请注意,我已将NOFORMAT更改为FORMAT并删除了NOSKIP。

在MSDN上的以下博客文章的评论部分找到解决此问题的提示: SQL Server–Storage Spaces/VHDx and 4K Sector Size

有关4k扇区驱动器的更多信息: http://blogs.msdn.com/b/psssql/archive/2011/01/13/sql-server-new-drives-use-4k-sector-size.aspx

答案 2 :(得分:5)

只需删除现有的.bak文件并重新运行。

答案 3 :(得分:4)

我们在2005年到2008年期间遇到了同样的问题。问题是我们在2008年尝试使用与2005年相同的备份文件(将备份一起添加到1个文件中)。

我们将脚本更改为备份到其他文件,问题已解决。我认为移动/删除旧文件会产生相同的影响

答案 4 :(得分:2)

我遇到了与OP相同的问题。在开发机器上,我们有一个PowerShell脚本,它从远程数据库服务器备份数据库并在本地存储备份文件。该脚本覆盖了相同的备份文件,一遍又一遍,脚本已经工作了几年。然后我将旋转的介质驱动器克隆到开发机器中的SSD。突然间,我们得到了与OP相同的错误:

  

Backup-SqlDatabase:System.Data.SqlClient.SqlError:无法使用备份文件'\ DevMachine \ Back-Up \ Demo.bak',因为它是   最初格式为扇区大小4096,现在在设备上   扇区大小512。

当然,我可以删除所有现有的.bak文件来解决问题。但如果它再次发生呢?我想要一个始终如一的命令行解决方案。

这是我们的原始代码:

Backup-SqlDatabase -ServerInstance "DBServer1" -Database "Demo" -BackupFile "\\DevMachine\Back-Up\Demo.bak" -BackupAction Database -CopyOnly -CompressionOption On -ConnectionTimeout 0 -Initialize -Checksum -ErrorAction Stop

经过一番摆弄后,我将其更改为以下内容以解决问题:

Backup-SqlDatabase -ServerInstance "DBServer1" -Database "Demo" -BackupFile "\\DevMachine\Back-Up\Demo.bak" -BackupAction Database -CopyOnly -CompressionOption On -ConnectionTimeout 0 -Initialize -Checksum -FormatMedia -SkipTapeHeader -ErrorAction Stop

基本上,添加了以下选项来解决问题:

-FormatMedia -SkipTapeHeader

请注意,如果您阅读Backup-SqlDatabase cmdlet的文档,则-FormatMedia列为仅适用于磁带而不适用于磁盘备份。但是,在备份到磁盘时,它似乎可以清除现有的备份文件     - https://docs.microsoft.com/en-us/powershell/module/sqlps/backup-sqldatabase

我发现如果我自己使用-FormatMedia选项,则会产生以下错误:

  

Backup-SqlDatabase:FormatMedia和SkipTapeHeader属性   设置有冲突。

我通过添加其他选项修复了第二个错误:-SkipTapeHeader。显然,它也适用于磁带备份,但它有效。

答案 5 :(得分:0)

我遇到了同样的问题,但只有恢复。我在Management studio中遇到此错误:"指定的强制转换无效。 (SqlManagerUI)" ...并且查询中出现此错误:" SQL Server无法处理此媒体系列。"

然后我做了一件简单的事情:我将备份集应用到默认备份文件夹中。例如: C:\ Program Files \ Microsoft SQL Server \ MSSQL10_50.SQLEXPRESS2008R2 \ MSSQL \ Backup \ bckup.bak 有效。我从这个地方恢复了它。 :-S 看起来SQL对扇区大小敏感。

答案 6 :(得分:0)

很可能Michaelanswer 是你们都需要的解决方案。 您只是有另一个具有相同名称和路径的备份文件。

https://stackoverflow.com/a/32662406/7841170

<块引用>

您所要做的就是使用不同的名称备份它。