如何对数据库模式进行版本控制?

如何准备 SQL 增量?您是手动将每个模式更改 SQL 保存到 delta 文件夹中,还是使用某种自动区分过程?

我对版本化数据库模式的约定和源代码感兴趣。也许是一个与模式不同的预提交钩子?

另外,除了 DbDeploy之外,还有哪些不同增量的选择?

编辑: 看到这些答案,我想澄清一下,我熟悉使用 delta 运行数据库迁移的标准方案。我的问题是如何自动创建三角洲。

此外,版本控制是为 PHP 和 MySQL 设计的,如果它们有所不同的话。(请不要使用 Ruby 解决方案)。

97128 次浏览

你看

是否有用于数据库结构更改的版本控制系统?

如何在 SVN 中版本我的 MS SQL 数据库?

还有杰夫的文章

将数据库置于版本控制之下

我能感受到你的痛苦,我也希望能有更好的答案。这可能更接近你要找的东西。

跟踪 DB 模式更改的机制

一般来说,我觉得没有足够的,可接受的解决方案,我在这方面自己卷。

我们将数据导出为一种可移植的格式(使用我们的工具链) ,然后将其导入到一个新的模式中。不需要增量 SQL。强烈推荐。

您可以看看另一个类似的帖子: 如何在 SVN 中版本我的 MS SQL 数据库?

我不管三角洲。我对主数据库进行更改,并拥有一个基于主数据库创建基于 XML 的构建脚本的工具。

当需要升级现有数据库时,我有一个程序,它使用基于 XML 的构建脚本来创建一个新的数据库和裸表。然后使用 INSERT INTO x SELECT FROM y 从旧数据库复制数据,然后应用所有索引、约束和触发器。

新表、新列、删除的列都可以自动处理,只需要一些调整复制例程的小技巧,我就可以处理列重命名、列类型更改和其他基本重构。

我不推荐在数据量巨大的数据库上使用这种解决方案,但是我会定期更新一个有400个表的超过1GB 的数据库。

您没有提到您使用的是哪个 RDBMS,但是如果是 MS SQL Server,那么 Red-Gate 的 SQL 比较对于我们在对象创建脚本之间创建增量是必不可少的。

我对这个话题也很感兴趣。

在 Django wiki 中对这个主题进行了一些讨论

有趣的是,它看起来像 CakePHP 内置了模式版本控制只使用 cake schema generate命令。

我使用 火鸟数据库的大多数开发和我使用的 火焰罗宾管理工具。它有一个很好的选项来记录所有的更改。它可以将所有内容记录到一个大文件,或者每个数据库更改一个文件。我使用第二个选项,然后将每个脚本存储在版本控制软件中——之前我使用 Subversion,现在我使用 Git。

我假设您可以找到一些 MySQL 工具,它们具有与 FlameRobin 对 Firebird 所具有的相同的日志特性。

在一个数据库表中,我存储了数据库结构的 版本号码,所以我可以很容易地升级任何数据库。我还编写了一个简单的 PHP 脚本,在任何目标数据库上逐个执行这些 SQL 脚本(数据库路径和用户名/密码在命令行中提供)。

还有一个选项可以记录所有 DML (插入、更新删除)语句,并且在修改每个数据库包含的一些“默认”数据时激活该选项。

我写了一篇漂亮的白皮书,详细介绍了我是如何做到这一点的。你可以在。Pdf 格式以及来自 给你的演示 PHP 脚本。

我不是一个自吹自擂的人,但我已经开发了一个内部网络应用程序来跟踪数据库模式的变化,并创建版本更新脚本。

这个工具被称为 巴西,现在是 MIT 许可下的开源工具。Brazil 是基于 Rails 的 ruby/ruby,支持对 Ruby DBI支持的任何数据库(MySQL、 ODBC、 Oracle、 Postgres、 SQLite)进行变更部署。

计划支持将更新脚本放入版本控制中。

我还开发了一组 PHP 脚本,开发人员可以在这些脚本中将 deltasql 脚本提交到一个中央存储库。

在其中一个数据库表(称为 TBSYNCHRONIZE)中,我存储了最新执行脚本的版本号,因此我可以通过使用为 Eclipse 开发的 Web 界面或客户端轻松地升级任何数据库。

网页界面允许管理多个项目,它还支持数据库“分支”。

您可以在 http://www.gpu-grid.net/deltasql上测试应用程序(如果您使用密码 testdbsync 以管理员身份登录)。 该应用程序是开源的,可在此下载: Http://sourceforge.net/projects/deltasql

Deltasql 在瑞士和印度被广泛使用,在日本也很流行。

Http://bitbucket.org/idler/mmp -用 PHP 编写的 mysql 模式版本控制工具

几个月前,我搜索了 MySQL 模式的版本控制工具。我发现了许多有用的工具,比如 Doctrine 迁移、 RoR 迁移,以及一些用 Java 和 Python 编写的工具。

但是没有一个人满足我的要求。

我的要求:

  1. 没有要求,排除 PHP 和 MySQL
  2. 没有模式配置文件,比如 Doctrine 中的 schema.yml
  3. 能够从连接中读取当前模式并创建新的迁移脚本,而不是在应用程序的其他安装中表示相同的模式。

我开始编写我的迁移工具,今天我有了 beta 版本。

如果你对这个话题感兴趣,请试一试。 请寄给我未来的请求和 bugreport。

源代码: bitbucket.org/idler/mmp/src 英文概述: bitbucket.org/idler/mmp/wiki/home 俄语概述: antonoff.info/development/mysql-migration-with-php-project

如果您仍在寻找选项,请查看 neXtep 设计器。它是一个基于版本控制概念的免费 GPL 数据库开发环境。在环境中,您总是使用版本化的实体,并且可以专注于数据模型开发。一旦发布完成,插入版本控制系统的 SQL 生成引擎可以在两个版本之间生成任何您需要的增量,并且如果您需要的话,它将为您提供一些交付机制。

除此之外,您还可以在开发期间同步和反向同步数据库,创建数据模型图,使用集成的 SQL 客户端查询数据库等等。

更多信息请查看维基百科: Http://www.nextep-softwares.com/wiki

它目前支持 Oracle、 MySql 和 PostgreSql,而且是 Java 语言,所以产品可以在 windows、 linux 和 mac 上运行。

我正在使用数据库模式的严格版本控制(在单独的表中跟踪)。脚本存储在版本控制中,但是它们在进行任何更改之前都会验证当前架构版本。

下面是 SQLServer 的完整实现(如果需要,可以为 MySQL 开发相同的解决方案) : 如何维护 SQLServer 数据库架构版本

我确保模式更改总是可添加的。所以我不会删除列和表,因为这样会删除数据,以后就不能回滚了。这样,使用数据库的代码可以回滚,而不会丢失数据或功能。

我有一个迁移脚本,它包含一些语句,如果表和列还不存在,这些语句会创建表和列,并用数据填充它们。

迁移脚本在生产代码更新和新安装之后运行。

当我想删除某些内容时,我会从数据库安装脚本和迁移脚本中删除它们,这样这些过时的模式元素将在新的安装中逐步淘汰。缺点是新安装不能在安装之前降级到旧版本。

当然,我通过这些脚本执行 DDL,而不是直接在数据库上保持同步。

对于 MySQL

当我找到一具新尸体:

首先,我检查结构:

mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB1_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_1.sql
mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB2_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_2.sql
diff FILENAME_1.sql FILENAME_2.sql > DIFF_FILENAME.txt
cat DIFF_FILENAME.txt | less

感谢 stackoverflow 用户,我可以编写这个快速脚本来发现结构差异。

Src: https://stackoverflow.com/a/8718572/4457531 & https://stackoverflow.com/a/26328331/4457531

在第二步中,我用 mysqldiff逐表检查数据。虽然有点过时,但是基于 information_schema数据的 php 循环肯定能成功

对于版本控制,我使用相同的方法,但是我使用 diff 结果格式化 SQL 更新脚本(用于升级或回滚) ,并使用版本号约定 (经过几次修改,版本号看起来像一个 ip 地址)

initial version : 1.0.0
^ ^ ^
| | |
structure change: - | |
datas added: -------- |
datas updated: --------