如何通过SSMS将本地MSSQL数据库复制到Laravel Sail Docker容器?
解决Docker容器中SQL Server的数据库迁移问题
你遇到的问题本质是:SSMS的复制数据库向导依赖目标SQL Server服务器上的SSMS配套组件(比如SQL Server Agent、Integration Services),但官方的mcr.microsoft.com/mssql/server镜像只包含核心数据库引擎,没有预装这些工具,所以直接用向导会报错。不过你完全可以通过其他方式实现数据库迁移,以下是几种可靠方案:
方案一:备份+还原(最推荐)
这是SQL Server迁移最通用的方式,步骤如下:
- 本地备份数据库:在SSMS中右键本地数据库 → 任务 → 备份,生成
.bak备份文件。 - 将备份文件传入Docker容器:
- 先通过
docker ps找到你的mssql容器名称(比如sail-mssql-1) - 执行命令将备份文件复制到容器的SQL Server数据目录:
docker cp /本地路径/你的备份文件.bak sail-mssql-1:/var/opt/mssql/data/
- 先通过
- 在容器中还原数据库:
- 在SSMS中连接到Docker的SQL Server(
tcp:localhost,1432) - 先执行以下命令查看备份文件中的逻辑文件名(用于后续还原路径配置):
RESTORE FILELISTONLY FROM DISK = N'/var/opt/mssql/data/你的备份文件.bak'; - 根据返回的逻辑名,执行还原命令(替换占位符为实际名称):
RESTORE DATABASE [你的目标库名] FROM DISK = N'/var/opt/mssql/data/你的备份文件.bak' WITH MOVE '原数据库逻辑文件名' TO N'/var/opt/mssql/data/你的目标库名.mdf', MOVE '原数据库日志逻辑文件名' TO N'/var/opt/mssql/data/你的目标库名_log.ldf', REPLACE; -- 若目标库已存在,用REPLACE覆盖
- 在SSMS中连接到Docker的SQL Server(
方案二:生成SQL脚本+执行
适合不需要完整备份、仅迁移结构和部分数据的场景:
- 生成迁移脚本:在SSMS中右键本地数据库 → 任务 → 生成脚本
- 配置脚本选项:
- 选择要迁移的对象(整个数据库或指定表)
- 在“高级”选项中,将编写数据的脚本设置为“True”(需要复制数据时勾选)
- 确保目标数据库版本选择SQL Server 2022(和你的Docker镜像版本匹配)
- 执行脚本:将生成的SQL脚本保存后,在SSMS连接Docker的SQL Server窗口中执行。
方案三:使用bcp命令行工具
适合单表或小批量数据的迁移:
- 本地导出数据:在Windows命令行执行(替换占位符):
bcp 本地库名.dbo.目标表名 out 导出文件名.csv -S localhost -U sa -P 本地数据库密码 -c -t, - 将CSV传入容器:
docker cp 导出文件名.csv sail-mssql-1:/var/opt/mssql/data/ - 容器中导入数据:
- 先进入容器的SQL命令行:
docker exec -it sail-mssql-1 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P MyDBP@ssword!1 - 先创建和本地表结构一致的表(可通过SSMS生成表结构脚本执行)
- 执行导入命令:
bcp 目标库名.dbo.目标表名 in /var/opt/mssql/data/导出文件名.csv -S localhost -U sa -P MyDBP@ssword!1 -c -t,
- 先进入容器的SQL命令行:
注意事项
- 确保Docker中的sa用户拥有
dbcreator角色权限,否则无法创建/还原数据库 - 备份文件放入
/var/opt/mssql/data/目录可避免权限问题(该目录是SQL Server容器的默认数据目录) - 本地数据库版本不要高于Docker中SQL Server的版本(你用的都是2022,不存在兼容问题)
内容的提问来源于stack exchange,提问作者user101289
相关产品推荐
相关产品推荐

