132

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

我对版本控制数据库模式的约定以及源代码感兴趣。也许是一个区分模式的预提交钩子?

此外,除了DbDeploy之外,还有哪些用于区分增量的选项?

编辑:看到答案我想澄清一下,我熟悉使用增量运行数据库迁移的标准方案。我的问题是关于自己创建增量,最好是自动创建。

此外,如果有区别,版本控制适用于 PHP 和 MySQL。(请不要使用 Ruby 解决方案)。

4

16 回答 16

62

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

如何在 SVN 中对我的 MS SQL 数据库进行版本控制?

和杰夫的文章

让您的数据库处于版本控制之下

我感受到你的痛苦,我希望有一个更好的答案。这可能更接近您正在寻找的内容。

跟踪数据库架构更改的机制

一般来说,我觉得对此没有适当的、可接受的解决方案,我在这方面推出了自己的解决方案。

于 2008-10-06T18:07:00.660 回答
4

您可能会看一下另一个类似的线程:如何在 SVN 中对我的 MS SQL 数据库进行版本控制?.

于 2008-10-06T18:08:07.193 回答
4

如果您仍在寻找选择:看看 neXtep 设计师。它是一个基于版本控制概念的免费 G​​PL 数据库开发环境。在环境中,您始终使用版本化实体,并且可以专注于数据模型开发。发布完成后,插入版本控制系统的 SQL 生成引擎可以在 2 个版本之间生成您需要的任何 delta,并在您需要时为您提供一些交付机制。

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

查看 wiki 了解更多信息: http: //www.nextep-softwares.com/wiki

它目前支持 Oracle、MySql 和 PostgreSql,并且是在 java 中,因此该产品可以在 windows、linux 和 mac 上运行。

于 2010-10-25T05:06:03.640 回答
3

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

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

新表、新列、已删除列都会自动处理,并通过一些小技巧来调整复制例程,我可以处理列重命名、列类型更改和其他基本重构。

我不会在具有大量数据的数据库上推荐此解决方案,但我会定期更新超过 1GB 且包含 400 个表的数据库。

于 2008-10-06T18:15:44.230 回答
3

我确保架构更改始终是附加的。所以我不会删除列和表,因为这会破坏数据并且以后无法回滚。这样,可以回滚使用数据库的代码而不会丢失数据或功能。

我有一个迁移脚本,其中包含创建表和列(如果它们尚不存在)并用数据填充它们的语句。

每当更新生产代码和新安装后,迁移脚本就会运行。

当我想删除某些东西时,我会从数据库安装脚本和迁移脚本中删除它们,这样这些过时的架构元素将在新安装中逐渐淘汰。缺点是新安装无法在安装之前降级到旧版本。

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

于 2015-07-16T10:51:26.430 回答
2

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

于 2008-10-06T18:20:06.110 回答
2

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

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

计划支持将更新脚本置于版本控制中。

于 2009-01-01T19:58:17.850 回答
2

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

于 2010-07-02T05:49:47.467 回答
1

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

于 2008-10-06T18:07:56.757 回答
1

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

在 Django wiki 中有一些关于这个主题的讨论

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

于 2008-10-06T18:51:55.123 回答
1

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

我假设您可以找到一些 MySQL 工具,它具有与 FlameRobin 为 Firebird 所做的相同的日志记录功能。

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

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

我写了一篇很好的白皮书,详细介绍了我是如何做到这一切的。您可以从此处下载 .pdf 格式的论文以及演示 PHP 脚本。

于 2008-10-06T19:48:01.517 回答
1

我还开发了一组 PHP 脚本,开发人员可以将他们的 deltasql 脚本提交到中央存储库。

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

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

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

deltasql 在瑞士和印度得到了有效的使用,在日本也很流行。

于 2009-01-29T13:26:54.480 回答
1

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

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

我的要求:

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

我开始写我的迁移工具,今天我有测试版。

如果您对此主题感兴趣,请尝试一下。请向我发送未来的请求和错误报告。

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

于 2010-07-07T21:31:42.570 回答
1

我使用http://code.google.com/p/oracle-ddl2svn/

于 2011-11-18T16:18:39.133 回答
1

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

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

于 2013-07-17T21:55:33.123 回答
1

对于 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 用户,我可以编写这个快速脚本来查找结构差异。

源代码:https ://stackoverflow.com/a/8718572/4457531 & https://stackoverflow.com/a/26328331/4457531

在第二步中,我逐表检查数据mysqldiff。这有点过时,但基于information_schema数据的 php 循环确实可以完成工作

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

initial version : 1.0.0
                  ^ ^ ^
                  | | |
structure change: - | |
datas added: -------- |
datas updated: --------
于 2016-09-06T07:54:29.413 回答