如何使用 Docker 和 Docker Compose 从备份开始自动创建和 运行 "clean" SQL 服务器数据库?
How to automate creating and running a "clean" SQL Server database starting from a backup using Docker and Docker Compose?
我在一家使用小型 SQL 服务器备份文件处理引导数据库的公司入职。我更愿意避免使用各种中间件污染我的主要 Windows 安装,所以我想尽可能多地对这些中间件进行 dockerize。
也就是说,我对 SQL 服务器管理不是很熟悉,所以对于如何完成细节以及我的想法是否正确,我有些不知所措。
我正在考虑两种基本方法:
- 将初始化数据库(即恢复备份)作为数据库映像构建的一部分。也就是说,我会向项目添加一个 Docker 文件
FROM microsoft/mssql-server-windows-express
,恢复备份文件,最终得到一个数据库准备好的容器镜像。
- 这里的好处是,将其作为映像构建的一部分是有意义的 - 如果初始备份文件已更新,我只需要使用
docker-compose up --build
即可获得正确的状态。
- 缺点是数据文件可能应该在 Docker 卷中,而这些在容器构建时并不真正存在。必须记住在图像重建之前清除卷以实际重新创建模式似乎会有点避免所需的优势。
- 制作一个一次性工具,将数据库恢复到存储在 Docker 卷中的 MDF+LDF,然后将它们与服务器分离。然后使用 attach_dbs 环境变量将它们附加到将 运行 长期的 SQL 服务器服务中。
- 这种方法使数据库文件的生命周期明显独立于任何给定 SQL 服务器实例的生命周期。
那么我的问题是:
- 如果这两种方法都可行,哪种方法更好?
- 是否有更好的方法来完成从容器中的 .bak -> 工作数据库?
- 如何使用命令行将 SQL 服务器数据库备份恢复到特定路径 - 即容器内的 "C:\Data"。 (这将使用卷映射到主机目录。)
不清楚您何时需要重置容器数据库的状态,您的两个选项听起来都行得通。
如果对备份的更改需要重建数据库,这可以在两阶段 windows 容器中非常有效地完成:
from microsoft/mssql-server-windows-developer as db_restore
copy db.bak \.
run Invoke-Sqlcmd -Query \"restore database [temp] from disk = 'c:\db.bak' \
with move 'Db_Data' to 'c:\db.mdf', \
move 'Db_Log' to 'c:\db.ldf'\"
run Invoke-Sqlcmd -Query \"shutdown with nowait\"
from microsoft/mssql-server-windows-developer
workdir \data
copy --from=db_restore \db.mdf .
copy --from=db_restore \db.ldf .
run Invoke-Sqlcmd -Query \"create database [Db] \
on primary ( name = N'Db_Data', filename = N'c:\data\db.mdf') \
log on (name = N'Db_Log', filename = N'c:\data\db.ldf') for attach\"
我在一家使用小型 SQL 服务器备份文件处理引导数据库的公司入职。我更愿意避免使用各种中间件污染我的主要 Windows 安装,所以我想尽可能多地对这些中间件进行 dockerize。
也就是说,我对 SQL 服务器管理不是很熟悉,所以对于如何完成细节以及我的想法是否正确,我有些不知所措。
我正在考虑两种基本方法:
- 将初始化数据库(即恢复备份)作为数据库映像构建的一部分。也就是说,我会向项目添加一个 Docker 文件
FROM microsoft/mssql-server-windows-express
,恢复备份文件,最终得到一个数据库准备好的容器镜像。- 这里的好处是,将其作为映像构建的一部分是有意义的 - 如果初始备份文件已更新,我只需要使用
docker-compose up --build
即可获得正确的状态。 - 缺点是数据文件可能应该在 Docker 卷中,而这些在容器构建时并不真正存在。必须记住在图像重建之前清除卷以实际重新创建模式似乎会有点避免所需的优势。
- 这里的好处是,将其作为映像构建的一部分是有意义的 - 如果初始备份文件已更新,我只需要使用
- 制作一个一次性工具,将数据库恢复到存储在 Docker 卷中的 MDF+LDF,然后将它们与服务器分离。然后使用 attach_dbs 环境变量将它们附加到将 运行 长期的 SQL 服务器服务中。
- 这种方法使数据库文件的生命周期明显独立于任何给定 SQL 服务器实例的生命周期。
那么我的问题是:
- 如果这两种方法都可行,哪种方法更好?
- 是否有更好的方法来完成从容器中的 .bak -> 工作数据库?
- 如何使用命令行将 SQL 服务器数据库备份恢复到特定路径 - 即容器内的 "C:\Data"。 (这将使用卷映射到主机目录。)
不清楚您何时需要重置容器数据库的状态,您的两个选项听起来都行得通。
如果对备份的更改需要重建数据库,这可以在两阶段 windows 容器中非常有效地完成:
from microsoft/mssql-server-windows-developer as db_restore
copy db.bak \.
run Invoke-Sqlcmd -Query \"restore database [temp] from disk = 'c:\db.bak' \
with move 'Db_Data' to 'c:\db.mdf', \
move 'Db_Log' to 'c:\db.ldf'\"
run Invoke-Sqlcmd -Query \"shutdown with nowait\"
from microsoft/mssql-server-windows-developer
workdir \data
copy --from=db_restore \db.mdf .
copy --from=db_restore \db.ldf .
run Invoke-Sqlcmd -Query \"create database [Db] \
on primary ( name = N'Db_Data', filename = N'c:\data\db.mdf') \
log on (name = N'Db_Log', filename = N'c:\data\db.ldf') for attach\"