Docker部署Linux版MS SQL Server恢复备份文件遇路径问题求助
我来帮你搞定这个恢复问题!你遇到的报错核心原因是:SQL Server备份文件里会记录原始数据库的物理文件路径(就是那个Windows风格的D:\路径),但Linux容器里根本不存在这个路径,所以恢复时SQL Server找不到地方存放数据文件和日志文件。咱们一步步解决:
第一步:先查看备份文件里的文件信息
首先得搞清楚备份里包含哪些逻辑文件,以及它们的原始路径。运行这条命令:
sqlcmd -S localhost -U SA -Q "RESTORE FILELISTONLY FROM DISK = '/trash/dbWINS_MPMBA201803141100.bak'"
执行后会得到类似这样的输出(示例):
LogicalName PhysicalName
MyTrash_Data D:\SQLData\MyTrash.mdf
MyTrash_Log D:\SQLLogs\MyTrash.ldf
这里的LogicalName是关键,你要把它们记下来,后面恢复命令要用到。
第二步:修改恢复命令,添加路径映射
容器里SQL Server默认的数据存储目录是/var/opt/mssql/data/,我们需要用MOVE参数把备份里的原始Windows路径替换成容器内的合法路径。修改后的命令如下(记得替换成你第一步得到的实际LogicalName):
sqlcmd -S localhost -U SA -Q "RESTORE DATABASE mytrash FROM DISK = '/trash/dbWINS_MPMBA201803141100.bak' WITH FILE = 1, NOUNLOAD, REPLACE, RECOVERY, -- 如果不需要后续追加备份恢复,用RECOVERY让数据库直接可用;如果要继续恢复其他备份,保留NORECOVERY STATS = 5, MOVE 'MyTrash_Data' TO '/var/opt/mssql/data/mytrash.mdf', MOVE 'MyTrash_Log' TO '/var/opt/mssql/data/mytrash.ldf'"
额外注意事项
- 确保你的
.bak文件已经正确挂载到容器的/trash目录下,不然容器连备份文件本身都找不到; - SA密码要正确,你可以交互式输入,也可以用
-P参数指定(不推荐明文输入,风险高); - 如果你后续还需要恢复差异备份或日志备份,再把
RECOVERY改回NORECOVERY,否则恢复完成后数据库会直接处于可用状态。
内容的提问来源于stack exchange,提问作者joe
相关产品推荐
相关产品推荐

