如何在Docker mssql-server-linux容器中附加主机数据卷的.MDF文件?
解决SQL Server Linux容器附加主机挂载MDF文件的问题
嘿,我猜你在附加数据库的时候肯定碰了不少钉子吧?毕竟Windows主机挂载到Linux容器的场景下,权限和路径的坑挺多的。结合你的操作步骤,我整理了几个最可能的问题点和解决办法:
1. 先搞定容器内的文件权限
Linux容器里的SQL Server是用mssql用户运行的,你挂载进去的MDF/LDF文件如果没给这个用户读写权限,大概率会失败。先进入容器检查下:
# 替换成你的容器ID,进入容器终端 docker exec -it <你的容器ID> bash # 查看data2目录下的文件权限 ls -l /var/opt/mssql/data2
要是看到文件所有者不是mssql,赶紧改权限:
# 递归修改目录和所有文件的所有者 chown -R mssql:mssql /var/opt/mssql/data2
改完退出容器,重启一下让权限生效:
docker restart <你的容器ID>
2. 用对T-SQL附加命令
别小看命令细节,路径得用Linux格式,而且空LDF文件的情况得特殊处理:
- 如果想用上你现有的空LDF文件,用这个命令:
CREATE DATABASE 你的数据库名 ON (FILENAME = '/var/opt/mssql/data2/你的数据库文件.mdf'), (FILENAME = '/var/opt/mssql/data2/你的日志文件.ldf') FOR ATTACH;
- 要是空LDF文件导致报错,直接让SQL Server重建日志就行:
CREATE DATABASE 你的数据库名 ON (FILENAME = '/var/opt/mssql/data2/你的数据库文件.mdf') FOR ATTACH_REBUILD_LOG;
3. Windows主机挂载的特殊注意事项
Windows和Linux的权限体系不一样,直接挂载主机目录容易出权限映射问题。你可以试试这两个办法:
- 临时给Windows的
c:\volumes目录开个全员读写权限(测试用,之后记得改回来) - 换成Docker管理的数据卷,比主机挂载靠谱多了:
之后把你的MDF/LDF文件复制到Windows上这个数据卷的默认路径:# 先创建一个Docker数据卷 docker volume create mssql-custom-data # 用这个数据卷启动容器 docker run -v mssql-custom-data:/var/opt/mssql/data -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=QWEqwe1!" -e 'MSSQL_PID=Express' -p 1433:1433 -d microsoft/mssql-server-linux:latestC:\ProgramData\Docker\volumes\mssql-custom-data\_data
4. 看日志找精准错误
要是上面的办法都不行,直接看容器日志找根因:
docker logs <你的容器ID>
日志里会明明白白告诉你是权限不够、文件找不到还是文件本身损坏,照着提示改就行。
内容的提问来源于stack exchange,提问作者Marco S.
相关产品推荐
相关产品推荐

