Deployment 数据库迁移:使用构建脚本管理还是应用程序启动时自动管理?

Deployment 数据库迁移:使用构建脚本管理还是应用程序启动时自动管理?,deployment,build-process,database-migration,Deployment,Build Process,Database Migration,我正在为一个新的web应用开发一个部署系统,我想知道在这个过程中管理数据库迁移的最佳点在哪里(如何进行迁移的问题完全是另一个问题) 看来有两条路要走: 使用可以 可以从命令手动运行 线路或作为自动控制系统的一部分 部署/构建过程 当应用程序启动时运行迁移 启动(我正在使用ASP.NET,所以 可以很容易地做到没有 导致长时间运行的用户请求) 是否有人对这些方法有任何建议/见解/经验?还有其他建议吗 我可以理解为什么#1可能更吸引人——它让我完全控制数据库何时更新。但是,我非常喜欢#2,因为它允许

我正在为一个新的web应用开发一个部署系统,我想知道在这个过程中管理数据库迁移的最佳点在哪里(如何进行迁移的问题完全是另一个问题)

看来有两条路要走:

  • 使用可以 可以从命令手动运行 线路或作为自动控制系统的一部分 部署/构建过程
  • 当应用程序启动时运行迁移 启动(我正在使用ASP.NET,所以 可以很容易地做到没有 导致长时间运行的用户请求)
  • 是否有人对这些方法有任何建议/见解/经验?还有其他建议吗


    我可以理解为什么#1可能更吸引人——它让我完全控制数据库何时更新。但是,我非常喜欢#2,因为它允许我在部署之间快速迭代并减少手动过程#2也可以在我的开发机器上使用,以允许更快的迭代。嗯,我开始觉得两者兼有可能是件好事……

    我更喜欢选项1,因为它看起来更灵活。我想我应该验证数据库模式(版本号?)是否与代码匹配,而不是在每个应用程序启动时实际执行迁移,如果不匹配,则抛出关于数据库模式不匹配的警告或错误。

    我们有一个销售人员系统,约有100个客户端,我们正在应用程序启动时更新数据库(没错,我们的应用程序是桌面应用程序。)我喜欢这种方法,如果我们有不确定的startpoint(客户端数据库是新的还是只更新到verison x.y.z?),它是安全的、迭代的

    但在服务器端,我更喜欢您的#1选项:我们在虚拟机上创建一个SQL查询文件(基于原始数据库的副本),并针对实际服务器运行此查询

    因此,伊姆霍:

    • 断开连接的客户端:启动,迭代脚本
    • 服务器:基于实际数据库和真实数据库在VM上创建的查询
    所以我也被问到这个问题,找到了一些(一半)框架作为。在谷歌搜索之后,DB版本控制/迁移框架有了一个很好的开端:。不一定需要文档,但团队博客可以相互测试。

    出于一些原因,我更喜欢选项#1。首先,集成测试通常要求您的DB架构是最新的,并启动一个网站来升级数据库chema将是一个巨大的时间浪费。其次,当你的站点运行时,你不能改变数据库模式(比如说,添加几个索引以加快速度)

    至于生产方面,在事务MSI风格的安装中升级数据库要比在每次应用程序启动时尝试升级好得多,因为最终可能会导致数据库应用程序版本不同步


    如果您正在寻找迁移框架,请看一看。

    如果应用程序必须在客户的机器上运行,那么在启动时迁移可以避免大量支持调用—假设您可以在无需用户干预的情况下进行无缝迁移(我希望您在正常运行web应用时没有修改数据库的权限)

    如果应用程序总是在您的控制下运行,那么自动迁移就不是一个问题,但仍然是一个很好的功能,特别是如果您希望最小化停机时间和手动部署步骤的话