繁体   English   中英

如何使用Docker和Docker Compose从备份开始自动创建和运行“干净的” SQL Server数据库?

[英]How to automate creating and running a “clean” SQL Server database starting from a backup using Docker and Docker Compose?

我正在一家使用小型SQL Server备份文件处理数据库自举的公司中入职。 我宁愿避免使用各种中间件来污染Windows的主要安装,因此我想尽可能多地对其进行docker化。

就是说,我对SQL Server管理不是很熟悉,因此我对如何完成这些细节以及我对此的想法是否完全正确感到有些困惑。

我正在考虑两种基本方法:

  • 将初始化数据库(即还原备份)作为数据库映像的一部分。 也就是说,我将使用FROM microsoft/mssql-server-windows-express添加一个Dockerfile到项目中,还原备份文件,最后得到一个容器映像,并准备好数据库。
    • 这样做的好处是将它作为映像构建的一部分是有意义的-如果初始备份文件已更新,我只需要使用docker-compose up --build来获取正确的状态。
    • 缺点是数据文件可能应该在Docker卷中,而这些在容器构建时实际上并不存在。 必须记住在重建映像之前实际要重新创建架构之前要清除卷,这似乎会消除所需的优势。
  • 做一个一次性工具,将数据库还原到存储在Docker卷中的MDF + LDF中,然后将其与服务器分离。 然后,使用attach_dbs环境变量将它们附加到将长期运行的SQL Server服务中。
    • 这种方法很明显,数据库文件的生存期与任何给定SQL Server实例的生存期无关。

我的问题是:

  1. 如果这两种方法都可行,那么哪种方法更好呢?
  2. 是否有更好的方法来完成从.bak->容器中工作数据库的操作?
  3. 如何使用命令行将SQL Server数据库备份还原到特定路径-容器内的“ 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\"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM