Windows版Docker:具有Windows容器的持久卷上的SQL Server数据库

时间:2019-08-28 08:36:59

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

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

这可能是因为数据目录中有master-db和system-dbs存储在此文件夹中,我试图在该目录中装入持久卷。

在用于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运行:

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:

1 个答案:

答案 0 :(得分:0)

似乎可以通过上面的解决方法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;