代码之家  ›  专栏  ›  技术社区  ›  millimoose Tomasz Nurkiewicz

如何使用docker和docker compose从备份开始自动创建和运行“干净”的sql server数据库?

  •  0
  • millimoose Tomasz Nurkiewicz  · 技术社区  · 6 年前

    我在一家公司上班,该公司使用一个小的sql server备份文件来处理数据库的引导。我更愿意避免用各种中间件污染我的主窗口安装,所以我希望尽可能多地停靠这些。

    也就是说,我不太熟悉sql server管理,所以对于如何完成细节我有些不知所措,如果我的想法完全正确的话。

    我在考虑两种基本方法:

    • 将初始化数据库(即还原备份)作为数据库映像生成的一部分。也就是说,我会添加一个dockerfile FROM microsoft/mssql-server-windows-express 对于该项目,还原备份文件,最终得到一个容器映像,并将数据库准备就绪作为最终结果。
      • 这里的好处是,将它作为映像构建的一部分是有意义的—如果初始备份文件被更新,我只需要使用 docker-compose up --build 得到正确的状态。
      • 缺点是数据文件可能应该在Docker卷中,而这些文件在容器构建时并不真正存在。在图像重建之前必须记住清除卷才能真正重新创建模式,这似乎会有点消除期望的优势。
    • 制作一个一次性工具,将数据库还原到docker卷中存储的mdf+ldf中,然后将它们与服务器分离。然后使用attach_dbs环境变量将它们附加到将长期运行的SQL Server服务中。
      • 这种方法使数据库文件的生存期明显独立于任何给定的sql server实例的生存期。

    我的问题是:

    1. 如果两种方法都可行的话,哪种方法更好?
    2. 是否有更好的方法来完成从.bak->在容器中工作的数据库?
    3. 如何使用命令行将SQL Server数据库备份还原到容器中的特定路径(即“c:\ data”)。(将使用卷映射到主机目录。)
    1 回复  |  直到 6 年前
        1
  •  2
  •   Peter Wishart    6 年前

    不清楚何时需要重置容器数据库的状态,这两个选项听起来都可以工作。

    如果对备份所做的更改需要重建数据库,则可以在两阶段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\"