我一直很难找到很好的示例,说明如何在开发,测试和生产服务器之间管理数据库模式和数据。
这是我们的设置。每个开发人员都有一个运行我们的应用程序和MySQL数据库的虚拟机。做他们想做的事是他们的个人沙箱。当前,开发人员将对SQL模式进行更改,并将数据库转储到他们提交到SVN中的文本文件中。
我们想要部署一个持续集成开发服务器,该服务器将始终运行最新的提交代码。如果我们现在这样做,它将为每个构建版本从SVN重新加载数据库。
我们有一台运行“候选发布版”的测试(虚拟)服务器。当前,部署到测试服务器是一个非常手动的过程,通常需要我从SVN加载最新的SQL并进行调整。此外,测试服务器上的数据不一致。最后,您将获得最后一个要提交的开发人员在其沙箱服务器上拥有的测试数据。
一切失败的地方就是部署到生产。由于我们无法用测试数据覆盖实时数据,因此需要手动重新创建所有架构更改。如果有大量的模式更改或转换脚本来操纵数据,那么这可能会变得很麻烦。
如果问题仅仅是模式,那将是一个更简单的问题,但是数据库中也存在“基础”数据,这些数据也在开发过程中进行了更新,例如安全性和权限表中的元数据。
这是我在迈向持续集成和一步构建的最大障碍。您如何解决?
后续问题:如何跟踪数据库版本,以便知道运行哪些脚本来升级给定的数据库实例?像Lance一样的版本表是否在标准程序下面提到?
感谢您引用Tarantino。我不在.NET环境中,但是我发现他们的DataBaseChangeMangement Wiki页面非常有用。特别是此Powerpoint演示文稿(.ppt)
我将要编写一个Python脚本,该*.sql
脚本将对照数据库中的表检查给定目录中的脚本名称,并根据形成文件名第一部分的整数顺序运行那些不存在的脚本名称。如果这是一个非常简单的解决方案(我怀疑会这样),那么我将在此处发布。
我有一个工作脚本。如果数据库不存在,它将处理数据库初始化,并根据需要运行升级脚本。还有一些用于擦除现有数据库和从文件导入测试数据的开关。它大约有200行,所以我不会发布(尽管有兴趣的话我可以将其放在pastebin上)。