Docker 使用SQL SERVER 还原sql server的.bak备份文件

一、镜像安装

1、从Docker库中拉取镜像
docker pull microsoft/mssql-server-linux:latest
执行完毕执行 docker images 查看镜像文件,显示如下:

2、拉取完之后,通过image id运行该镜像
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=1234qwer!' \
   -p 1401:1433 --name sql1 \
   -d 314918ddaedf
   
   ## 或者 通过镜像名称跟版本号运行该镜像
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=1234qwer!' \
   -p 1401:1433 --name sql1 \
   -d microsoft/mssql-server-linux:latest

#-e 'ACCEPT_EULA=Y' 表示 将ACCEPT_EULA 变量设置为任何值以确认你接受最终用户许可协议,sql server 镜像必须设置。
#-e 'MSSQL_SA_PASSWORD=1234qwer!'  指定至少8个字符的强密码,sql server 镜像必须设置。
# 这里可以在run的时候通过-v 指定共享目录,这样后面就不用通过docker cp 拷贝数据库文件到容器中了。
3、要查看您的Docker容器,请使用该docker ps命令。
docker ps -a 

4、更改SA密码
docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '1234qwer!' -Q 'ALTER LOGIN sa WITH PASSWORD="1234qwer!"'
5、连接到SQL Server
使用该docker exec -it命令在正在运行的容器中启动交互式bash shell。在以下示例sql1中–name,创建容器时由参数指定的名称。
 sudo docker exec -it sql1 bin/bash
一旦进入容器,用sqlcmd本地连接。Sqlcmd默认不在路径中,因此您必须指定完整路径。
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '1234qwer!'
如果成功,您应该到达sqlcmd命令提示符:1>,结果参考如下截图:

6、在外部使用navicat来连接数据库,

二、还原数据库

1、创建镜像sql1的文件目录
docker exec -it sql1 mkdir /var/opt/mssql/backup
2、使用docker cp 命令拷贝文件
docker cp test.bak sql1:/var/opt/mssql/backup

3、还原bak数据库文件
docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost \
   -U SA -P '1234qwer!' \
   -Q 'RESTORE FILELISTONLY FROM DISK = "/var/opt/mssql/backup/test.bak"' \
   | tr -s ' ' | cut -d ' ' -f 1-2
你应看到类似于下面的输出:

4、调用RESTORE DATABASE命令还原在容器内的数据库。 为每个文件上一步中指定新路径。
docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
   -S localhost -U SA -P '1234qwer!' \
   -Q 'RESTORE DATABASE TESTDB FROM DISK = "/var/opt/mssql/backup/test.bak" WITH MOVE "linshi" TO "/var/opt/mssql/data/linshi.mdf", MOVE "linshi_log" TO "/var/opt/mssql/data/shifenzheng_log.ldf"'
你应看到类似于下面的输出:


注:可能会遇到以下问题

解决方法:执行如下命令,查看相关文件分析结果
docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
   -S localhost -U SA -P '1234qwer!' \
   -Q 'RESTORE FILELISTONLY FROM DISK ="/var/opt/mssql/backup/test.bak"'

查看关键文件的名称与关系,然后替换命令中相关字符。