您如何版本化数据库架构?[关闭]


128

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

我对用于对数据库架构和源代码进行版本控制的约定感兴趣。也许是一个预先提交的钩子,可以与架构进行区分?

另外,除了DbDeploy之外,还有哪些差异差异选项

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

同样,版本控制适用于PHP和MySQL(如果有所帮助)。(请没有Ruby解决方案)。


我使用schemasync生成补丁(和回滚脚本)。这些已添加到SVN存储库中。它并不完美,但对我来说效果很好。另外,使用schemasync部署架构更改非常容易
Jay

此链接显示为空-仍然存在吗?
jocull

看起来好像已经移动了:github.com/mmatuson/SchemaSync
Jay

Answers:


61

看到

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

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

和杰夫的文章

使数据库受版本控制

我感到您很痛苦,希望有一个更好的答案。这可能更接近您想要的。

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

总的来说,我觉得没有足够的,可以接受的解决方案,因此我会在这一领域做出自己的贡献。


正如您从我的问题可以看出的那样,我知道增量的概念。我的问题是关于自动创建约定的约定。
伊兰·加珀林

我想那时候我会自己动手...;)
Eran Galperin

您是否尝试过DBDiff:github.com/DBDiff/DBDiff?它非常适合@EranGalperin,因为它可以对SQL中的模式和数据进行自动迁移。披露我是背后的开发商!
Jasdeep Khalsa


4

如果您仍在寻找选项,请访问neXtep Designer。这是一个基于版本控制概念的免费GPL数据库开发环境。在环境中,您始终使用版本控制的实体,并且可以专注于数据模型开发。发布完成后,版本控制系统上插入的SQL生成引擎可以生成两个版本之间所需的任何增量,并在需要时为您提供一些交付机制。

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

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

它当前支持Oracle,MySql和PostgreSql,并且使用Java语言,因此该产品可在Windows,Linux和Mac上运行。


3

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

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

只要更新生产代码并在安装新代码后,迁移脚本就会运行。

当我想删除某些内容时,可以通过从数据库安装脚本和迁移脚本中删除它们来完成,以便这些陈旧的架构元素将在新安装中逐步淘汰。缺点是新安装无法在安装之前降级到较旧的版本。

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


2

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

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

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

我不建议在具有大量数据的数据库上使用此解决方案,但我会定期更新具有400个表的1GB以上的数据库。


这听起来有些麻烦,尤其是在与多个开发人员打交道时。同样,构建过程听起来要求很高,我希望尽可能简单。
伊兰·加珀林

我承认,花了一段时间才做好了准备,但现在几乎不需要花费任何精力就可以准备升级,而花更少的钱去执行一个升级。另外,我喜欢的一件事是我可以进行临时的修补程序更改,并且对升级过程没有影响。每次升级都是一个全新的数据库。
Darrel Miller

2

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


1
这是针对Mysql的,我已经更新了我的问题
Eran Galperin

2

我不是要吹牛,而是开发了一个内部Web应用程序来跟踪对数据库架构的更改并创建版本化的更新脚本。

该工具称为巴西,现已根据MIT许可开放源代码。巴西是基于Ruby的Ruby,并且支持将更改部署到Ruby DBI支持的任何数据库(MySQL,ODBC,Oracle,Postgres,SQLite)。

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


巴西看起来不错,太糟糕了,我主要使用PHP。是否曾考虑过移植系统?
Eran Galperin


1

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


3
什么是可移植格式?以及如何仅应用与先前版本的差异将其导入新架构?
伊兰·加珀林

1

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

我假设您会找到一些MySQL工具,该工具具有与FlameRobin用于Firebird相同的日志记录功能。

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

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

我写了一篇不错的白皮书,详细介绍了如何进行所有这些操作。您可以从此处下载.pdf格式的文件以及示例PHP脚本。


1

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

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

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

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

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


1

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

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

我的要求:

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

我开始写迁移工具,今天我有beta版。

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

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


您还拥有一个新工具:DBV:stackoverflow.com/a/13837473/6309
VonC 2012年



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

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: --------

0

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

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


我刚刚读了你的文章。您是否仍在使用此功能,或者自从采用诸如DBUp或ReadyRoll之类的现成解决方案以来?
David Atkinson

当前,我所有的项目都依赖Entity Framework Code-First,并且我使用其迁移来对数据库进行版本控制。我在几个旧项目中都有本文中的解决方案,但我从未替换过。在其他项目中,我使用Redgate工具来管理架构和迁移。
Zoran Horvat

太棒了,您是Redgate的用户!如果你想使用展鹏工具与EF结合,这是可能的:red-gate.com/blog/database-lifecycle-management/...
大卫·阿特金森

我一定会在下一个机会尝试。它为我们提供了很好的服务,但是与此同时,我已经更换了团队,现在我在尝试将其引入本机EF支持之前进行了尝试。
Zoran Horvat

0

经过长时间的调查,我发现有些第三者工具或Visual Studio项目类型不满足我的要求,或者只是有关该理论的博客但没有实现。因此,我实现了一个工作系统,该系统使用了将近一年,并在此处进行了说明:

http://nalgorithm.com/2015/11/09/database-versioning-part-1/

根据兴趣,会继续写更多。


2
您好,欢迎来到SO。这个答案不是很完整,基本上只提供一个链接。仅链接的答案不是最佳答案:如果链接无效,您的答案将无用。因此,请对其进行编辑,并至少添加一个摘要,以了解在此处可以找到的内容,以便您的答案具有独立于链接的价值。谢谢!
Fabio说恢复Monica
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.