我花了很长时间才找到了一些很好的例子,说明如何在开发、测试和生产服务器之间管理数据库模式和数据。
这是我们的设备。每个开发人员都有一个运行我们的应用程序和 MySQL 数据库的虚拟机。他们想做什么就做什么,这是他们的私事。目前,开发人员将对 SQL 模式进行更改,并将数据库转储到一个文本文件中,然后提交到 SVN 中。
我们希望部署一个持续集成开发服务器,它将始终运行最新提交的代码。如果我们现在这样做,它将为每次构建从 SVN 重新加载数据库。
我们有一个运行“候选版本”的测试(虚拟)服务器部署到测试服务器目前是一个非常手工的过程,通常需要我从 SVN 加载最新的 SQL 并对其进行调整。而且,测试服务器上的数据不一致。您最终将获得最后提交的开发人员在其沙箱服务器上拥有的任何测试数据。
在这里,一切都会崩溃,这就是部署到生产环境的过程。由于我们不能用测试数据覆盖活动数据,因此需要手动重新创建所有模式更改。如果存在大量的模式更改或转换脚本来操作数据,那么这可能会非常麻烦。
如果问题只是模式,问题会更简单,但是数据库中有“基础”数据,在开发过程中也会更新,比如安全性和权限表中的元数据。
这是我看到的向持续集成和一步构建发展的最大障碍。 你如何解决这个问题?
接下来的问题是: 如何跟踪数据库版本,以便知道要运行哪些脚本来升级给定的数据库实例?Lance 提到的版本表是否低于标准程序?
谢谢你提到塔伦蒂诺。我没有。NET 环境下,但我发现他们的 DataBaseChangeMangement 维基页面是非常有帮助的。尤其是这个 简报(. ppt)
我将编写一个 Python 脚本,根据数据库中的一个表检查给定目录中的 *.sql
脚本的名称,并根据构成文件名第一部分的整数来运行那些不存在的脚本。如果它是一个相当简单的解决方案,我怀疑它将是,然后我会张贴在这里。
我已经准备好了剧本。如果数据库不存在,它将处理数据库的初始化,并根据需要运行升级脚本。还有用于擦除现有数据库和从文件导入测试数据的开关。它大约有200行,所以我不会发布它(尽管如果有兴趣的话,我可能会把它贴在粘贴面上)。