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

cod*_*keh 21 sql t-sql sql-server backup sql-server-2012

在我们的开发环境中,我们长期以来通过各种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
Run Code Online (Sandbox Code Playgroud)

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

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

我的查询是:

BACKUP DATABASE MyDB TO  DISK = N'D:\MyDB.bak' WITH  INIT , NOUNLOAD ,  NAME = N'MyDB backup',  NOSKIP ,  STATS = 10,  NOFORMAT, BLOCKSIZE = 4096
Run Code Online (Sandbox Code Playgroud)

任何人都可以了解如何将数据库备份和恢复到具有不同扇区大小的HDD?

小智 29

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


Wil*_*l L 22

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

您可以通过将原始备份命令更改为以下内容来解决此问题:

BACKUP DATABASE MyDB TO  DISK = N'D:\MyDB.bak' WITH  INIT , NOUNLOAD ,  NAME = N'MyDB backup',  STATS = 10,  FORMAT
Run Code Online (Sandbox Code Playgroud)

请注意,我已将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


Gay*_*ake 6

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


Van*_*gor 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

-FormatMedia -SkipTapeHeader
Run Code Online (Sandbox Code Playgroud)

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

我发现如果我-FormatMedia单独使用该选项,它会生成以下错误:

Backup-SqlDatabase:FormatMedia 和 SkipTapeHeader 属性的设置存在冲突。

我通过添加附加选项修复了第二个错误:-SkipTapeHeader。显然,这也是用于磁带备份的,但它确实有效。