SQL Server跨服务器复制数据库:空间不足时的恢复方法咨询
问题解答
首先明确:直接替换备份文件来完成恢复是不可行的。SQL Server的备份文件是包含数据库完整(或增量)数据的结构化文件,恢复过程需要读取备份文件的完整内容来重建数据库,中途替换会导致备份文件损坏,直接触发恢复失败。
针对你的场景(目标服务器剩余空间仅26GB,无法存放90GB备份,但恢复后空间足够),这些方案可以完美解决问题:
直接从源服务器网络恢复(最优方案)
不需要把备份文件复制到目标服务器,直接通过网络读取源服务器上的备份文件进行恢复。前提是目标服务器能访问源服务器的备份共享路径(需要设置好共享权限,同时确保SQL Server服务账号拥有该共享路径的访问权限)。
执行示例命令:RESTORE DATABASE YourTargetDB FROM DISK = '\\SourceServerName\BackupSharedFolder\Your90GBBackup.bak' WITH REPLACE, -- 覆盖目标服务器上同名数据库(如果存在) MOVE 'YourSourceDB_Data' TO 'D:\TargetDataPath\YourTargetDB.mdf', -- 指定数据文件存放路径 MOVE 'YourSourceDB_Log' TO 'E:\TargetLogPath\YourTargetDB.ldf'; -- 指定日志文件存放路径这个方法完全跳过了备份文件在目标服务器的存储步骤,仅需要目标服务器有足够空间存放最终的数据库文件(你已经确认恢复后空间足够),完美适配你的场景。
分卷备份+分阶段恢复
如果源服务器允许重新备份,可以把90GB的备份拆分成多个小体积的分卷(比如每个20GB,共5个分卷),这样每个分卷的大小都小于目标服务器的剩余26GB空间。
源端分卷备份命令示例:BACKUP DATABASE YourSourceDB TO DISK = 'C:\SourceBackup\YourDB_Vol1.bak', DISK = 'C:\SourceBackup\YourDB_Vol2.bak', DISK = 'C:\SourceBackup\YourDB_Vol3.bak', DISK = 'C:\SourceBackup\YourDB_Vol4.bak', DISK = 'C:\SourceBackup\YourDB_Vol5.bak' WITH INIT, COMPRESSION; -- INIT覆盖原有备份,COMPRESSION开启压缩进一步减小体积恢复时,先复制第一个分卷到目标服务器,执行恢复命令时指定所有分卷路径(即使有些还没复制,后续SQL Server会提示你加载下一个分卷):
RESTORE DATABASE YourTargetDB FROM DISK = 'D:\TargetBackup\YourDB_Vol1.bak', DISK = 'D:\TargetBackup\YourDB_Vol2.bak', DISK = 'D:\TargetBackup\YourDB_Vol3.bak', DISK = 'D:\TargetBackup\YourDB_Vol4.bak', DISK = 'D:\TargetBackup\YourDB_Vol5.bak' WITH REPLACE, MOVE 'YourSourceDB_Data' TO 'D:\TargetDataPath\YourTargetDB.mdf', MOVE 'YourSourceDB_Log' TO 'E:\TargetLogPath\YourTargetDB.ldf', NORECOVERY; -- 先不完成恢复,等所有分卷加载后再收尾执行后SQL Server会提示你加载下一个分卷,此时你可以删掉已经读取完成的第一个分卷,复制第二个分卷到目标服务器,继续恢复操作,以此类推。等所有分卷加载完成后,最后执行
RESTORE DATABASE YourTargetDB WITH RECOVERY;完成恢复。启用备份压缩(如果未使用)
如果源端之前的备份没有开启压缩,开启压缩后备份体积通常会大幅减少(一般能降到原大小的30%-60%),90GB的备份有可能压缩到26GB以内,这样就能直接复制到目标服务器进行常规恢复。
压缩备份命令示例:BACKUP DATABASE YourSourceDB TO DISK = 'C:\SourceBackup\YourDB_Compressed.bak' WITH INIT, COMPRESSION;压缩后检查备份文件大小,如果小于26GB,就可以复制到目标服务器进行常规恢复操作。
临时挂载源服务器备份磁盘
如果你的环境支持,可以通过iSCSI、存储映射等方式,把源服务器存放备份文件的磁盘直接挂载到目标服务器上。目标服务器可以像读取本地磁盘一样读取备份文件进行恢复,恢复完成后再卸载挂载,全程不需要复制备份文件。
内容的提问来源于stack exchange,提问作者Whistler

