跟踪和/或自动化数据库架构更改的最佳方法是什么?我们的团队使用 Subversion 版本控制和我们已经能够实现一些我们任务自动化 (推送到临时服务器生成、 部署到生产服务器的测试过的代码) 通过这种方式,但我们仍要做数据库更新手动。我想要查找或创建一个解决方案,使我们能够有效地跨不同环境中的服务器继续使用 Subversion 作为后端通过该代码和数据库更新推到不同的服务器时。

许多流行软件程序包包含自动更新脚本,它检测数据库版本并应用所需的更改。这是 (跨多个项目和多个环境有时和语言),甚至在更大范围内这样做的最佳方式?如果这样,是否有任何现有代码有简化的过程,还是最好只是将我们自己的解决方案?任何人都有实现类似前和集成 Subversion 提交后的操作挂钩,或这是否是个好主意?

虽然支持多个平台的解决方案应该是更可取,我们肯定需要为我们的工作大部分是在该平台上支持 Linux/Apache/MySQL/PHP 堆栈。

2008-08-04 21:31:40
问题评论:

回答:

在 Rails 的世界中,没有迁移,在其中对数据库的更改在进行拼音,而不是 SQL 的数据库特有然后再将其脚本的概念。Ruby 迁移代码最终被转换为特定于您的当前数据库; DDL这使得交换机数据库平台非常方便。

每次更改您进行到数据库,编写新的迁移问题。迁移通常有两种方法︰ 中"向上"的方法可应用所做的更改并撤消所做的更改进行"向下"的方法。一个命令带来了最新的数据库,还可以用于将数据库恢复到特定版本的架构。在 Rails,迁移将保存在项目目录中其自己的目录和获取签入到版本控制项目的任何其他代码一样。

Rails 迁移此 Oracle 指南涵盖迁移非常出色。

使用其他语言的开发人员查找一下迁移并实施它们自己的特定语言版本。我知道的Ruckusing,一个 PHP 迁移系统,来模拟后导轨的迁移;它可能是您正在寻找的内容。

Ruckusing FTW-我们适应我们的数据库系统和与它非常高兴。

感谢您提 Ruckusing

现在位于 github: github.com/ruckus/ruckusing-migrations

我们使用类似于 bcwoord 来保持我们的数据库架构同步跨 5 不同的安装 (生产、 转移和几个开发安装),并将备份版本控制中,它的效果非常好。我会详细一些阐述︰


若要同步的数据库结构,我们有一个脚本,update.php 和大量的文件编号的 1.sql、 2.sql、 3.sql 等。该脚本使用一个额外的表来存储数据库的当前版本号。手工编制的 N.sql 文件版本 (N-1) 转到 N 版本的数据库。

它们可以用于添加表,添加列,从旧的数据迁移到新的列格式然后除去此列,插入"大纲"的数据行,如用户类型,等等。从根本上说,它可以执行任何操作,并使用正确的数据迁移脚本将永远不会丢失数据。

更新脚本如下所示︰

  • 连接到数据库。
  • 使当前数据库的备份 (因为资料出现的错误) [了 mysqldump]。
  • 如果它不存在,则创建簿记表 (称为 _meta)。
  • _Meta 表中读取的当前版本。假设 0,如果未找到。
  • 对于所有.sql 文件版本高于编号,它们按顺序执行
  • 如果其中一个文件产生了错误︰ 备份到备份前的滚
  • 否则,更新执行的最高.sql 文件记录表中的版本。

一切进入源代码管理的每个安装都有一个脚本,用来更新到最新版本执行单个脚本 (调用 update.php 使用正确的数据库密码等)。我们 SVN 更新通过调用脚本,自动数据库更新脚本,因此代码更新附带必要的数据库更新临时和生产环境。

我们可以使用相同脚本以重新创建整个数据库从零开始;我们只是除去并重新创建数据库,然后运行该脚本,它将完全重新填充该数据库。我们可以使用脚本来填充自动化测试的空数据库。


花了仅几个小时来设置此系统时,就概念上很简单每个人获取版本编号方案,并已能够前进和发展数据库的设计,而无需进行通信或手动执行修改所有数据库中非常重要。

尽管粘贴来自 phpMyAdmin 查询时要小心 !这些生成的查询通常包括数据库的名称,它肯定不希望因为它会破坏您的脚本 !如下所示创建表mydbnewtable(...)如果在系统上的数据库 mydb 不调用将失败。我们创建了预注释 SVN 挂钩,将不允许包含mydb的字符串,这是一个明确的信号,有人复制/粘贴从 phpMyAdmin 不正确检查.sql 文件。

您是怎样处理冲突的?更改数据库,例如存储过程中的同一元素的多个开发人员?如果您正在同时在同一分支中,或者您有两个开发连线 (两个分支) 发生这种情况

冲突是非常少见的;唯一的事情就发生了变化,实际上是两个人会尝试创建相同的 N.sql 文件。当然,第一个赢得,第二个被迫重命名为下一个最高数字,再试一次。我们没有数据库版本控制分支上通过。

我团队的脚本出数据库的所有更改,并提交对 SVN,这些脚本,以及每个版本的应用程序。这允许为增量更改的数据库,而不会丢失任何数据。

从一个版本进入下一步,您只需运行一组更改脚本和数据库是最新版本,您仍然有您的所有数据。它可能不是最简单的方法,但它肯定是有效。

这里的主要问题真正使其便于开发人员编写脚本到源代码控制以与团队共享他们的本地更改。我已经多年,面临此问题,数据库专业人士已提出了 Visual Studio 的功能。如果您希望具有相同的功能的开源工具,试试这个︰ 有有趣的http://dbsourcetools.codeplex.com/ ,-Nathan。

如果您仍在寻找解决方案︰ 我们希望采用一种称为 neXtep 的设计器工具。它是可以与其将对整个数据库进行版本控制的数据库开发环境。您在其中可以跟踪每个更改的版本控制储存库工作。

当您需要发布更新时,您可以提交您的组件产品将自动生成 SQL 将从以前的版本升级脚本。当然,您可以从任何 2 个版本生成此 SQL。

然后您有许多选项︰ 可以拍摄这些脚本,然后将它们放在您的 SVN 与您的应用程序的代码,以便它将部署由现有的机制。另一个选项是使用 neXtep 的交付机制︰ 叫作"传递包"中导出脚本 (SQL 脚本 + XML 描述符),安装程序可以了解此包并将其部署到目标服务器同时确保 strcutural 一致性、 相关性检查注册已安装的版本等。

本产品是 GPL 并使 Linux、 Mac 和 windows 上运行基于 Eclipse。它也支持 Oracle,Mysql 和 Postgresql (DB2 支持的方式是) 时刻。去看看 wiki,您将找到更多详细信息︰ http://www.nextep-softwares.com/wiki

看起来有趣。没有命令行界面,或一个计划?

请输入您的翻译

Mechanisms for tracking DB schema changes [closed]

确认取消