You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器中恢复SQL Server 2017数据库报错求助

Docker中SQL Server 2017数据库恢复报错解决方法

报错详情

操作系统在'/var/opt/mssql/data/release_129x.mdf'上执行'RestoreContainer::ValidateTargetForCreation'时返回错误'1(Incorrect function.)'。
文件'EIS_411'无法恢复到'/var/opt/mssql/data/release_129x.mdf',请使用WITH MOVE指定有效的文件位置。
操作系统在'/var/opt/mssql/data/release_129x.ldf'上执行'RestoreContainer::ValidateTargetForCreation'时返回错误'1(Incorrect function.)'。
文件'EIS_411_log'无法恢复到'/var/opt/mssql/data/release_129x.ldf',请使用WITH MOVE指定有效的文件位置。

当前执行命令

# 启动SQL Server容器
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=365653wz" -p 1401:1433 -v D:\docker\mssql:/var/opt/mssql --name mssql -d mcr.microsoft.com/mssql/server:2017-latest

# 查看备份文件内的数据库文件列表
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '365653wz' -Q 'RESTORE FILELISTONLY FROM DISK = "/var/opt/mssql/EIS_1293.bak"' | tr -s ' ' | cut -d ' ' -f 1-2

# 数据库恢复命令
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "365653wz" -Q 'RESTORE DATABASE EIS_1293 FROM DISK = "/var/opt/mssql/EIS_1293.bak"  WITH MOVE "EIS_411" TO "/var/opt/mssql/data/release_129x.mdf" , MOVE "EIS_411_log" TO "/var/opt/mssql/data/release_129x.ldf"'

问题原因

这类错误主要由以下几种情况导致:

  • Windows挂载目录到Linux容器时的权限映射问题,容器内mssql用户没有目标目录的读写权限
  • 目标路径下已存在同名的.mdf或.ldf文件
  • 跨文件系统挂载导致的兼容性限制

解决方法

1. 修复容器内目录权限

进入容器,为目标目录赋予mssql用户专属权限:

# 进入运行中的容器
docker exec -it mssql bash

# 修改目录所属用户及权限
chown -R mssql:mssql /var/opt/mssql/data
chmod -R 700 /var/opt/mssql/data

完成后重新执行恢复命令。

2. 改用容器内部目录恢复

避开挂载的Windows目录,将备份文件复制到容器内部目录后再恢复:

# 将本地备份文件复制到容器内部数据目录
docker cp D:\docker\mssql\EIS_1293.bak mssql:/var/opt/mssql/data/EIS_1293.bak

# 在容器内执行恢复命令
docker exec -it mssql /opt/mssql-tools/bin/sqlcmd -U SA -P '365653wz' -Q 'RESTORE DATABASE EIS_1293 FROM DISK = "/var/opt/mssql/data/EIS_1293.bak" WITH MOVE "EIS_411" TO "/var/opt/mssql/data/release_129x.mdf", MOVE "EIS_411_log" TO "/var/opt/mssql/data/release_129x.ldf"'

3. 删除已存在的目标文件

如果目标路径下已有同名的数据文件或日志文件,先删除再恢复:

# 进入容器删除重复文件
docker exec -it mssql rm -f /var/opt/mssql/data/release_129x.mdf /var/opt/mssql/data/release_129x.ldf

删除后重新运行恢复命令。

4. 使用Docker Volume替代直接挂载

Windows环境下,使用Docker Volume可以避免跨文件系统的权限问题:

# 创建专用的Docker Volume
docker volume create mssql-data

# 启动容器时挂载Volume到数据目录,同时挂载本地目录用于存放备份
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=365653wz" -p 1401:1433 -v mssql-data:/var/opt/mssql/data -v D:\docker\mssql:/var/opt/mssql/backup --name mssql -d mcr.microsoft.com/mssql/server:2017-latest

# 复制备份文件到容器的backup目录
docker cp D:\docker\mssql\EIS_1293.bak mssql:/var/opt/mssql/backup/EIS_1293.bak

# 执行恢复命令
docker exec -it mssql /opt/mssql-tools/bin/sqlcmd -U SA -P '365653wz' -Q 'RESTORE DATABASE EIS_1293 FROM DISK = "/var/opt/mssql/backup/EIS_1293.bak" WITH MOVE "EIS_411" TO "/var/opt/mssql/data/release_129x.mdf", MOVE "EIS_411_log" TO "/var/opt/mssql/data/release_129x.ldf"'

内容的提问来源于stack exchange,提问作者Cheng Ma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:01:28