Version control 如何管理具有分支机构的中型项目上的数据库修订?

Version control 如何管理具有分支机构的中型项目上的数据库修订?,version-control,deployment,project-management,database-versioning,Version Control,Deployment,Project Management,Database Versioning,在工作中,我们有4个人在几个不同的项目上一起工作。对于每个项目,我们每个人都有一个本地副本,然后有一个开发、登台和实时部署,以及我们拥有的任何分支(我们使用subversion)。我们的数据库是MySQL 所以我的问题是,管理每个部署(以及开发人员的本地副本)对数据库进行了哪些修订的好方法是什么。现在,每个更改都会进入一个文本文件,该文件在名称中加上时间戳,并放入项目下的一个文件夹中。老实说,这不太管用。。我需要一个解决方案来帮助跟踪在何处应用的内容。 上面的博客让我们了解了当前的数据库版本控制

在工作中,我们有4个人在几个不同的项目上一起工作。对于每个项目,我们每个人都有一个本地副本,然后有一个开发、登台和实时部署,以及我们拥有的任何分支(我们使用subversion)。我们的数据库是MySQL

所以我的问题是,管理每个部署(以及开发人员的本地副本)对数据库进行了哪些修订的好方法是什么。现在,每个更改都会进入一个文本文件,该文件在名称中加上时间戳,并放入项目下的一个文件夹中。老实说,这不太管用。。我需要一个解决方案来帮助跟踪在何处应用的内容。

上面的博客让我们了解了当前的数据库版本控制系统。简单地说,没有更新脚本就不会对数据库进行任何更改,所有更新脚本都在我们的源代码管理存储库中

我们只管理模式更改,但您也可以/愿意考虑将数据的转储保持在版本控制中;使用mysqldump创建这样的文件是一个非常简单的练习

我们的解决方案在一个关键方面与博客中介绍的解决方案不同:它不是自动化的。我们必须手动应用数据库更新等。虽然这可能会稍微耗费时间,但它推迟了全自动系统所需的一些工作。然而,我们已经自动化了一件事,那就是软件中的db版本跟踪:这非常简单,它确保我们的软件知道它所运行的数据库,并且只有在它知道它所使用的模式时才会运行


我们解决方案中最困难的部分是如何将分支中的更新合并到主干中。我们花了一些时间开发了一个工作流,以解决两个开发人员同时尝试合并具有DB更新的分支的可能性,以及如何处理它。我们最终决定在版本控制中锁定一个文件(我们所讨论的文件实际上是一个表,将软件版本映射到db版本,这有助于我们的手动管理策略),就像线程的关键部分一样,并且获得锁的开发人员将更新主干。完成后,其他开发人员将能够锁定,他们有责任对脚本进行任何必要的更改,以确保避免预期的版本冲突和其他错误的jujuju。

我们将所有数据库脚本(数据和架构/ddl)保留在版本控制中。我们还保留了一个变更的中央目录。当开发人员更改模式/DDL文件或添加以某种方式更改数据的脚本时,这些文件将与SVN提交编号一起添加到目录中

我们在内部建立了一个小型实用程序,它读取目录更改,并通过获取目录中每个修订的内容并应用这些内容,基于目录的内容构建一个大型更新脚本。这个概念非常类似于这个工具,我认为它最初来自于这个工具,所以您可以使用它。它至少会为您提供一个良好的起点,从这一点上您可以定制更直接适合您需求的解决方案


祝你好运

> P>如果数据库很好地映射到一组数据访问对象,请考虑使用“迁移”。其思想是将数据模型存储为应用程序代码,其中包含在每个数据库版本中向前和向后移动的步骤

我相信

Java已经成功了

这里有一个例子

要更改版本,您可以运行一个简单的脚本,逐步执行所有向上或向下的版本,以获得所需的版本。它的美妙之处在于,您可以将您的迁移检查到与应用程序代码相同的源代码库中——这一切都在一个地方

也许其他人可以建议使用其他迁移库

干杯


编辑:另请参见和(从上面的帖子)。

我已经读过这篇文章,老实说,我不喜欢这个想法。我认为需要构建一个完整的系统来真正支持多个部署。在您描述的基础上添加了更多内容:为了获得该解决方案,当然需要构建一些基础设施工具,但并非所有工具都是必需的(我们选择不允许软件“自我更新”)这是一个如此强大的解决方案,最初的努力很快就会得到回报。我认为这是一个良好的开端(你所描述的与我所想的相似)。不过,我一直在思考的最大问题之一是合并。。我们最近似乎做了很多。希望我们在一个分支中没有太多的模式更改,但它确实发生了。我们也遇到了这种情况-我在我的帖子中也写了一个关于我们的方法的小广告。这看起来是一个非常有趣的选择。我很想听听一些人对.NET迁移库的经验。感谢您的更新,我将尝试迁移路线。我已经对migratordotnet做了一些自己的修改,现在已经非常成功地使用了它。