【问题标题】:Restore-SqlDatabase using a backup with a different sector sizeRestore-SqlDatabase 使用具有不同扇区大小的备份
【发布时间】:2019-11-27 03:31:54
【问题描述】:

我有一个 PowerShell 脚本,它从生产环境复制备份并将它们还原到本地 sql 服务器实例,以便对数据库执行一些操作,然后将它们重新备份到本地驱动器。

此命令的一部分使用Restore-SqlDatabase 命令。

此错误是由于我的机器 (4096) 和生产环境 (512) 中的扇区大小不同。

无法使用备份文件“.bak”,因为它最初是 格式化为扇区大小 512,现在在具有扇区大小的设备上 4096

我想自动化这个工作流程,所以我正在寻找一种方法来运行这个脚本,而不管目标机器的扇区大小或生产环境如何。 PowerShell 中是否有解决此问题的方法?

Restore-SqlDatabase -ServerInstance $DatabaseServer -Database $DatabaseName -RelocateFile $relocate -BackupFile $BackupFilePath -RestoreAction Database

我知道答案in this question,但具体来说,我想在 powershell 中执行此操作(使用 Restore-SqlDatabase 命令),而不是 SQL。

【问题讨论】:

  • @tukan 我做了,并解释了为什么这个问题不相关。
  • 尝试将备份文件放在网络驱动器上,并将其用作还原源。如果“网络驱动器”实际上是本地计算机(例如\\machinename\c$\...),这甚至可能有效。免责声明:未经测试。这背后的想法是通过网络重定向器强制引擎使用缓冲 I/O,而不是它使用的非缓冲 I/O(这需要对齐扇区大小)。如果您想在原始机器上恢复备份,您当然需要这样做。
  • 重点是,如果您向下滚动,您将找到 Backup-SqlDatabase cmlet 的答案。

标签: sql-server database powershell


【解决方案1】:

恢复

可以在Restore-SqlDatabase 期间使用BlockSize 参数指定扇区大小。您在此处传入的块大小需要是您的物理硬盘的块大小。

例如。

Restore-SqlDatabase -BlockSize 4096 -ServerInstance $DatabaseServer -Database $DatabaseName -RelocateFile $relocate -BackupFile $BackupFilePath -RestoreAction Database 

可以使用以下命令以编程方式确定块大小:

Get-CimInstance -ClassName Win32_Volume | Select-Object BlockSize

备份

Backup-SqlDatabase 命令也接受 -BlockSize 参数,但是将其设置为原始块大小或我机器的块大小在覆盖原始备份文件时不起作用。

可以完全省略参数并简单地将备份保存在磁盘上的其他位置。在这种情况下,SQL Server 将选择硬盘的块大小(在我的例子中是 4096)。

【讨论】:

    猜你喜欢
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2021-01-28
    • 2013-07-06
    • 1970-01-01
    相关资源
    最近更新 更多