我有一个运行docker-compose的MS SQLServer 2017 Linux Docker容器。 (正在
Windows主机。)
服务器正在运行,我添加了数据,并且该数据在多个docker-compose up / down
之间是持久的
因为服务器使用 docker卷。当我使用docker-compose down -v
时,数据消失了。因此, 这可以按预期工作:
services:
sql:
image: mcr.microsoft.com/mssql/server:2017-GA-ubuntu
volumes:
- sqldata:/var/opt/mssql
...
volumes:
sqldata:
driver: local
name: sqldata
现在,我正在尝试备份和还原数据库。我知道直接使用SQLServer的“正常”方式。 这有效:
# Restore a backup inside the container volume
docker exec -it sql mkdir /var/opt/mssql/backup
docker cp .\Test.bak sql:/var/opt/mssql/backup
sqlcmd -S 127.0.0.1,1433 -U sa -P Secr3tSA_Passw0rd -H 127.0.0.1,1433 -Q "RESTORE DATABASE [Test] FROM DISK='/var/opt/mssql/backup/Test.bak' WITH REPLACE"
# Backup a database inside the container volume, then copy to local file
docker exec sql rm -rf /var/opt/mssql/backup/Test.bak
sqlcmd -S 127.0.0.1,1433 -U sa -P Secr3tSA_Passw0rd -H 127.0.0.1,1433 -Q "BACKUP DATABASE [Test] TO DISK='/var/opt/mssql/backup/Test.bak'"
docker cp sql:/var/opt/mssql/backup/Test.bak .\Test.bak
现在我在想,也许有比将SA密码放入BAT文件更好的方法 并将其分发给我的客户和服务技术人员。只需获取卷的副本 应该可以解决问题!
我发现了:
# Make sure the SQLServer is not writing/blocking any files.
docker-compose stop sql
# Backup & Restore the sqldata volume.
docker run --rm -v sqldata -v $pwd\backup:/backup ubuntu bash -c "cd /whsqldata && tar xvf /backup/backup.tar --strip 1"
docker run --rm -v sqldata -v $pwd\backup:/backup ubuntu bash -c "cd /whsqldata && tar cvf /backup/backup.tar ."
# Restart the SQLServer.
docker-compose start sql
这将在我的用户目录中创建预期的backup.tar ...但是它很小!然后 还原后,SQLServer无法连接到数据库。 backup.tar似乎没有内容。 但是仔细检查后,我的sqldata量也增加了!它是空的!当我开始bash安装 同一卷,我可以看到目录,但是里面什么也没有:
docker run --rm -v sqldata -it ubuntu
/ # ls sqldata/ -a
. ..
/ #
SQLServer的数据持续存在。所以必须将其保存在某个地方,对吗?我想念什么?!
答案 0 :(得分:0)
好的,在阅读了How should I backup & restore docker named volumes的答案之后,我发现我的错误在于我如何安装该卷。我必须写-v sqldata
而不是-v sqldata:/sqldata
。还更改了我命令中的某些路径。
完成的命令是:
# Backup the data volume
docker run --rm \
-v sqldata:/sqldata \
-v $pwd\:/backup \
ubuntu tar cvf /backup/backup.tar /sqldata
# Remove existing data volume (clear up old data, if exists)
docker volume rm sqldata
# Restore the data volume
docker run --rm \
-v sqldata:/sqldata \
-v $pwd\:/backup \
ubuntu tar xvf /backup/backup.tar -C sqldata --strip 1