【问题标题】:SQLServer Docker: How do I backup & restore the data *volume*? [duplicate]SQLServer Docker:如何备份和恢复数据*volume*? [复制]
【发布时间】:2019-09-03 07:54:31
【问题描述】:

我有一个使用 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 的数据保持不变。所以它必须保存在某处,对吗?我错过了什么?!

【问题讨论】:

    标签: sql-server docker docker-compose docker-volume


    【解决方案1】:

    好的,在阅读了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
    

    【讨论】:

      猜你喜欢
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 2014-04-29
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      相关资源
      最近更新 更多