我一直很难找到管理开发、测试和生产服务器之间数据库架构和数据的良好示例。
我们的设置如下。每个开发人员都有一个虚拟机运行我们的应用程序和MySQL数据库,这是他们个人的沙盒,可以随意更改。目前,开发人员将对SQL架构进行更改,并将数据库转储为文本文件,然后提交到版本控制系统中。
我们想要部署一个持续集成开发服务器,它将始终运行最新提交的代码。如果现在这样做,每次构建都会从SVN重新加载数据库。
我们有一个运行“发布候选版”的测试(虚拟)服务器。部署到测试服务器目前是一个非常手动的过程,通常涉及我从SVN加载最新的SQL并进行微调。此外,测试服务器上的数据是不一致的。你最终会得到上一个提交者在他的沙盒服务器上拥有的任何测试数据。
所有问题的根源在于部署到生产环境。由于我们不能用测试数据覆盖实时数据,这就需要手动重新创建所有的架构更改。如果需要大量架构更改或转换脚本来操作数据,这可能会变得非常棘手。
如果问题仅限于架构,那将是一个更容易的问题,但是数据库中还有“基本”数据也在开发过程中更新,例如权限表中的元数据。
这是我看到实现持续集成和一步构建的最大障碍。你们怎么解决这个问题呢?
跟进问题:你如何跟踪数据库版本,以便知道要运行哪些脚本来升级给定的数据库实例?像Lance下面提到的版本表是标准程序吗?
谢谢你提供Tarantino的参考。虽然我不在.NET环境中,但我发现他们的DataBaseChangeMangement维基页面非常有帮助。特别是这个Powerpoint演示文稿(.ppt)
我将编写一个Python脚本,检查给定目录中的*.sql
脚本的名称,并根据文件名的第一个整数部分顺序运行数据库中不存在的脚本。如果这是一个相当简单的解决方案,就像我预计的那样,我会在这里发布它。
我已经有一个可工作的脚本。它处理初始化数据库(如果不存在)和根据需要运行升级脚本。还有开关用于清除现有数据库以及从文件导入测试数据。代码大约有200行,所以我不会发布它(但如果有兴趣,我可能会把它放在pastebin上)。