【问题标题】:Docker for Windows: SQL Server Database on persistent Volume with Windows-Container适用于 Windows 的 Docker:具有 Windows 容器的持久卷上的 SQL Server 数据库
【发布时间】:2019-08-28 08:36:59
【问题描述】:

在 Docker for Windows 上并使用 windows 容器,我无法让我的持久卷在 windows 容器的主数据库目录上工作。这将是C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA 我怎样才能获得数据库持久卷的好处,而不必弄乱备份和恢复到 mssql-server-container?

这可能是因为我尝试挂载持久卷的文件夹中存储了主数据库和系统数据库的数据目录。

在用于 Linux 容器的 SQL Server 中,这很简单,您可以将持久卷连接到 /var/opt/mssql 并使您的数据库持久化。

我知道我可以将数据库从备份恢复到容器中,但这有两个主要缺点:我必须有一个很大的容器,因为我正在使用一个大数据库。因此,我将容器的 20 GB 限制扩展到了 60 GB,但是……每次从备份中重建数据库非常耗时。 第二个缺点是,如果 mssql-dev 容器被杀死,数据库也会丢失。然后,在这个数据库上的任何工作都消失了。如果数据库可以驻留在持久卷上,情况会有所不同。

docker run -d -e sa_password=<Password> -e ACCEPT_EULA=Y -v "C:\mylocalfolder:C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA" microsoft/mssql-server-windows-developer

错误消息是“Windows 系统调用失败:虚拟计算机或容器意外关闭。 (0xc0370106)

解决方法 1

将持久卷连接到另一个位置,例如 c:\mydata 以防止上面的错误消息。 然后在不使用标准数据库文件夹的情况下将数据库连接到服务器。

提取数据库.bak文件,所以有mdf和日志文件

--Get the name of your DB
RESTORE FILELISTONLY
FROM DISK = 'c:\mydata'
GO
--do the extraction of the bak file to certain folder
RESTORE DATABASE mydatabase
FROM DISK = 'c:\mydata'
WITH REPLACE,
MOVE 'mydatabase' TO 'c:\mydata\extractedDb.mdf',
MOVE 'mydatabase_log' TO 'c:\mydata\extractedLog.ldf'
GO

完成此操作后,您现在应该在持久卷上准备好数据库文件。现在将数据库附加到服务器。这必须通过创建一个新的数据库来完成但是这个过程只需要几纳秒就可以完成!

CREATE DATABASE StackoverflowIsGreat
ON (FILENAME = 'c:\mydata\extractedDb.mdf'),
(FILENAME = 'c:\mydata\extractedLog.ldf')
FOR ATTACH;

现在数据库在持久卷中是安全的。如果 db-server 容器出现故障或正在重建,您只需再次运行最后一条语句(或者更好地在您的 docker-compose 或 dockerfile 中实现它):

CREATE DATABASE StackoverflowIsGreat
ON (FILENAME = 'c:\mydata\extractedDb.mdf'),
(FILENAME = 'c:\mydata\extractedLog.ldf')
FOR ATTACH;

解决方法 2

-attach_dbs 参数的工作方式似乎相同。 码头工人运行:

docker run -p 1433:1433 --name mssql-dev -e sa_password=<yourpassword> -e ACCEPT_EULA=Y -e attach_dbs="[{'dbName':'PowerSlide_SQLDB','dbFiles':['C:\\your\\path\\database.mdf','C:\\sqldata\\databaselog.ldf']}]" -v "d:\sqldata:C:\sqldata" microsoft/mssql-server-windows-developer

或者,如果您更喜欢 Docker-Compose,这有点棘手。我不得不省略括号外的前导和结束 ' 并将括号内的双引号替换为 ' 以使其工作。

version: '3.2'
services:
  mssql-dev:
    container_name: mssql-dev
    image: 'microsoft/mssql-server-windows-developer'
    volumes:
      - "d:\\sqldata:C:\\sqldata"
    ports:
      - "1433:1433"
    restart: always
    environment:
      - "ACCEPT_EULA=Y"
      - "sa_password=yourpassword"
      - attach_dbs=[{"dbName":"<yourDbName>","dbFiles":["C:\\<your>\\path\\database.mdf","C:\\your\\path\\databaselog.ldf"]}]
volumes:
  mssql-dev-data:

【问题讨论】:

  • 数据卷容器,也许吧? Use Volumes 您可能需要针对 Windows 版 Docker 稍微修改 docker for linux 配方。
  • 我希望我使用数据卷,我使用上面的'docker run'命令形式来简化。通常我使用 docker-compose 并明确使用它来创建一个卷:docker version: '3.2' services: mssql-dev: container_name: mssql-ps-dev image: 'microsoft/mssql-server-windows-developer' volumes: - "d:\\mssql-dev-data:c:\\sqldata" &lt;...&gt; volumes: mssql-dev-data: 但如果我连接到 'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\ '文件夹。

标签: sql-server database docker docker-for-windows


【解决方案1】:

看来这个问题可以用上面的解决方法 1 和 2 来回答。

  1. 将持久卷连接到另一个位置,例如 c:\mydata,以防止出现上述错误消息。然后在不使用标准数据库文件夹的情况下将数据库连接到服务器。
  2. 提取数据库.bak文件,所以有mdf和日志文件
--Get the name of your DB
RESTORE FILELISTONLY
FROM DISK = 'c:\mydata'
GO
--do the extraction of the bak file to certain folder
RESTORE DATABASE mydatabase
FROM DISK = 'c:\mydata'
WITH REPLACE,
MOVE 'mydatabase' TO 'c:\mydata\extractedDb.mdf',
MOVE 'mydatabase_log' TO 'c:\mydata\extractedLog.ldf'
GO
  1. 通过以下三种方式之一将数据库附加到服务器:

Docker 运行示例:

docker run -p 1433:1433 --name mssql-dev -e sa_password=<yourpassword> -e ACCEPT_EULA=Y -e attach_dbs="[{'dbName':'PowerSlide_SQLDB','dbFiles':['C:\\your\\path\\database.mdf','C:\\sqldata\\databaselog.ldf']}]" -v "d:\sqldata:C:\sqldata" microsoft/mssql-server-windows-developer

如果您更喜欢 Docker-Compose,那就有点棘手了。我不得不省略括号外的前导和结束 ' 并将括号内的双引号替换为 ' 以使其工作。 docker-compose 示例:

version: '3.2'
services:
  mssql-dev:
    container_name: mssql-dev
    image: 'microsoft/mssql-server-windows-developer'
    volumes:
      - "d:\\sqldata:C:\\sqldata"
    ports:
      - "1433:1433"
    restart: always
    environment:
      - "ACCEPT_EULA=Y"
      - "sa_password=yourpassword"
      - attach_dbs=[{"dbName":"<yourDbName>","dbFiles":["C:\\<your>\\path\\database.mdf","C:\\your\\path\\databaselog.ldf"]}]
volumes:
  mssql-dev-data:

或使用 SQL 命令附加数据库

CREATE DATABASE StackoverflowIsGreat
ON (FILENAME = 'c:\mydata\extractedDb.mdf'),
(FILENAME = 'c:\mydata\extractedLog.ldf')
FOR ATTACH;

【讨论】:

    猜你喜欢
    • 2022-08-10
    • 2019-04-07
    • 2019-06-02
    • 2018-10-31
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    相关资源
    最近更新 更多