使用不同扇区大小的硬盘备份数据库

24

在我们的开发环境中,我们一直使用特定的备份和还原脚本来处理我们的各个产品,针对不同版本的SQL Server以及不同的环境配置,一直都没有问题。

最近,我们升级到了SQL Server 2012作为我们的标准开发服务器,使用SQL兼容性级别2005(90)以便与旧系统保持兼容。现在我们发现,在一个特定的开发者机器上,当尝试备份数据库时,会出现以下错误:

无法使用备份文件“D:\MyDB.bak”,因为它最初是使用512字节扇区大小格式化的,而现在它在一个4096字节扇区大小的设备上。备份数据库异常终止。

命令如下:

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

有人能解释一下我如何备份并恢复不同扇区大小的硬盘上的数据库吗?


备份正在尝试通过 WITH INIT 覆盖旧的备份文件。您是否尝试过将其备份到不同的文件名?BACKUP DATABASE MyDB TO DISK = N'D:\MyDB2.bak'... - Dave Mason
@DMason 很抱歉,我也遇到了同样的错误。 - codemonkeh
嗯,你提到SQL 2012升级,这似乎不应该成为问题。硬件方面有什么需要考虑的吗?你提到硬件和分区没有发生变化。所以,它仍然是相同的磁盘系统,对吗? - Dave Mason
我找到了一篇文章,提到使用跟踪标志进行调查:http://social.msdn.microsoft.com/Forums/sqlserver/en-US/d2d2e4f5-c1b8-463b-ba99-659d2157a572/sql-server-backup-using-blocksize-parameter?forum=sqldatabaseengine - Dave Mason
@DMason 说实话硬件都是一样的,唯一的变化是换了一个新版本的SQL服务器。有趣的是,我发现即使在同一台机器上运行另一个产品时也不会出现此问题,尽管数据库应该具有类似的格式。感谢提供的链接,我会试一试。 - codemonkeh
8个回答

42

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


25
这个问题是由于不同驱动器使用不同的扇区大小引起的。
您可以通过将原始备份命令更改为以下命令来解决此问题:
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和4K扇区大小 有关4k扇区驱动器的更多信息: http://blogs.msdn.com/b/psssql/archive/2011/01/13/sql-server-new-drives-use-4k-sector-size.aspx

我只是在同一位置备份到不同的文件名。不确定为什么这曾经是个问题。在某些情况下,这可能是一个虚假错误? - user1585204

8

只需删除现有的 .bak 文件,然后重新运行即可。


1
这是因为NOFORMAT将强制保留现有的媒体头,而在这种情况下它是不同的。仅仅删除文件将会使它写入一个带有正确媒体头的新文件。 - Gayan Dasanayake
在我的情况下,问题出在我之前在一个硬盘上做了一个.bak文件,然后我换成了固态硬盘(克隆了驱动器)。当新的备份操作尝试覆盖.bak文件时,似乎会检查块大小,即使它会替换文件。 - undefined

5
我遇到了与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://learn.microsoft.com/en-us/powershell/module/sqlps/backup-sqldatabase 我发现如果仅使用-FormatMedia选项,会生成以下错误:

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

我通过添加另一个选项-SkipTapeHeader来解决第二个错误。显然,这也是针对磁带备份的,但它起作用了。

4
我们曾经遇到从2005到2008的相同问题。问题在于我们尝试在2008年使用与2005年相同的备份文件(将备份附加在一起成为一个文件)。
我们更改了脚本以备份到不同的文件中,问题得到了解决。我想像移动/删除旧文件会产生同样的影响。

1
我遇到了同样的问题,但只是在还原时出现。我在管理工具中收到了这个错误:"Specified cast is not valid. (SqlManagerUI)" ...并且在查询中出现了这个错误:"SQL Server cannot process this media family." 然后我做了一件简单的事情:将备份集复制到默认备份文件夹中。例如:C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS2008R2\MSSQL\Backup\bckup.bak 它奏效了。我从这个位置恢复了它。 :-S 看起来SQL对扇区大小很敏感。

1

0
在我的情况下,我试图覆盖已有相同文件名的现有数据库备份。我只需删除现有文件并使用相同的名称保存新的备份文件即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接