我很难找到有关如何在开发、测试和生产服务器之间管理数据库模式和数据的好示例。
这是我们的设置。每个开发人员都有一个运行我们的应用程序和 MySQL 数据库的虚拟机。这是他们的个人沙箱,可以为所欲为。目前,开发人员将对 SQL 架构进行更改,并将数据库转储到他们提交到 SVN 的文本文件中。
我们希望部署一个持续集成开发服务器,该服务器将始终运行最新提交的代码。如果我们现在这样做,它将为每个构建从 SVN 重新加载数据库。
我们有一个运行“候选版本”的测试(虚拟)服务器。目前,部署到测试服务器是一个非常手动的过程,通常需要我从 SVN 加载最新的 SQL 并对其进行调整。另外,测试服务器上的数据不一致。您最终会得到最后一个开发人员在其沙箱服务器上提交的测试数据。
一切都崩溃的地方是生产部署。由于我们无法用测试数据覆盖实时数据,因此这涉及手动重新创建所有架构更改。如果有大量的模式更改或转换脚本来操作数据,这可能会变得非常棘手。
如果问题只是架构,那么问题会更容易,但是数据库中的“基础”数据也会在开发过程中更新,例如安全和权限表中的元数据。
这是我在走向持续集成和一步构建过程中看到的最大障碍。怎么办you解决这个问题?
后续问题:如何跟踪数据库版本,以便知道要运行哪些脚本来升级给定的数据库实例?像兰斯下面提到的版本表是标准程序吗?
感谢您对塔伦蒂诺的提及。我不在.NET环境中,但我找到了他们DataBaseChangeMangement 维基页面 http://code.google.com/p/tarantino/wiki/DatabaseChangeManagement非常有帮助。尤其是这个幻灯片演示 (.ppt) http://tarantino.googlecode.com/svn/docs/Database-Change-Management.ppt
我将编写一个 Python 脚本来检查名称*.sql
给定目录中的脚本针对数据库中的表,并根据构成文件名第一部分的整数按顺序运行不存在的脚本。如果这是一个非常简单的解决方案(正如我所怀疑的那样),那么我会将其发布在这里。
我有一个可用的脚本。如果数据库不存在,它会初始化数据库,并根据需要运行升级脚本。还有用于擦除现有数据库和从文件导入测试数据的开关。大约有 200 行,所以我不会发布它(如果有兴趣的话我可能会把它放在 Pastebin 上)。