Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQLServerDocker:如何备份&;还原数据*卷*?_Sql Server_Docker_Docker Compose_Docker Volume - Fatal编程技术网

Sql server SQLServerDocker:如何备份&;还原数据*卷*?

Sql server SQLServerDocker:如何备份&;还原数据*卷*?,sql-server,docker,docker-compose,docker-volume,Sql Server,Docker,Docker Compose,Docker Volume,我有一个运行Docker compose的MS SQLServer 2017 Linux Docker容器。(正在进行 (Windows主机。) 服务器正在运行,我添加了数据,这些数据在多个docker compose up/down 由于服务器使用的是docker卷。当我使用docker compose down-v时,数据消失。因此,这是预期的: 现在我正在尝试备份和恢复数据库。我知道直接使用SQLServer的“正常”方式这是有效的: 现在我在想,也许有一个比把SA密码放入BAT文件更好的

我有一个运行Docker compose的MS SQLServer 2017 Linux Docker容器。(正在进行 (Windows主机。) 服务器正在运行,我添加了数据,这些数据在多个
docker compose up/down
由于服务器使用的是docker卷。当我使用
docker compose down-v
时,数据消失。因此,这是预期的:

现在我正在尝试备份和恢复数据库。我知道直接使用SQLServer的“正常”方式这是有效的:

现在我在想,也许有一个比把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卷也是如此!它是空的!?当我开始一个猛击的时候 同一卷,我可以看到目录,但其中没有任何内容:

docker run --rm -v sqldata -it ubuntu
/ # ls sqldata/ -a
. ..
/ #

SQLServer的数据仍然存在。所以它必须被保存在某个地方,对吗?我错过了什么

好的,在阅读了对的答案后,我发现我的错误在于如何安装卷。我必须编写
-vsqldata:/sqldata
,而不是
-vsqldata
。还更改了我的命令中的一些路径

完成的命令包括:

# 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
docker run --rm -v sqldata -it ubuntu
/ # ls sqldata/ -a
. ..
/ #
# 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