2010-08-30 61 views
6

主要问题是数据库结构的版本控制。SVN如何体面地跟踪数据库结构修改?

标准的mysqldump和pg_dump实用程序不会生成非常适合版本控制的文件。

dump命令会生成带有自动增量值,TOC条目等的转储文件。由于这些对象会不断变化,因此它总会产生巨大的差异文件。

PostgreSQL的DIFF

-- 
--- TOC entry 2630 (class 0 OID 0) 
+-- TOC entry 2549 (class 0 OID 0) 
-- Dependencies: 6 
-- Name: SCHEMA adm; Type: COMMENT; Schema: -; Owner: admin 
@@ -61,5 +61,5 @@ 

MySQL的DIFF

--- Dump completed on 2010-07-20 14:33:44 
+-- Dump completed on 2010-08-11 8:59:39 
Index: /db.sql 
=================================================================== 
--- /db.sql (revision 1274) 
+++ /db.sql (revision 1317) 
@@ -36,5 +36,5 @@ 
    `message` text, 
    PRIMARY KEY (`id`) 
-) ENGINE=MyISAM AUTO_INCREMENT=21122 DEFAULT CHARSET=utf8; 
+) ENGINE=MyISAM AUTO_INCREMENT=23730 DEFAULT CHARSET=utf8; 

对版本控制的更好的办法任何建议/链接/公用事业感谢!

谢谢。

回答

6

看看LiquiBase(http://www.liquibase.org/

这是专为允许开发者提交数据库更改为SVN的工具,然后安全地并自动将其应用到数据库中。

更改可以通过比较两个数据库进行反向工程,或由开发人员手工编写并提交。

它还确保数据库更改以正确的顺序应用,并且只应用于给定数据库一次。

+0

伟大的提示。我一直在寻找数据库版本控制的开源解决方案。 – 2010-08-30 16:30:36

+0

谢谢你的提示。正在寻找这种工具。 – Igor 2010-09-02 21:46:46

6

我们只是从头开始编写用于创建数据库的脚本。开发人员在文本文件中编辑脚本,而不是在数据库中编辑脚本。开发人员无权访问生产SQL服务器,并且DBA团队使用专门设计用于比较数据库模式的工具(在我们的示例中为Red-Gate SQLCompare)以执行生产构建。他们将从脚本创建一个新的空数据库,并使用比较工具来检测更改。有些更改可以自动应用,有些必须进行手动更改。

这不是一个完美的系统,但它迄今为止工作得很好。

+1

这与我们在很多项目中使用的方法是一样的,对于我们来说这很有效,可能有一些开发人员抱怨不得不编写sql来创建表格。我通常告诉他们,他们不应该依赖设计师(即使他们确实节省了一些时间)。 – 2010-08-30 16:25:52

+3

我同意。如果开发人员要使用数据库,他们应该能够从头开始编写表格创建脚本,而不必运行太多的脑细胞。如果他们不能,也许他们应该把数据库工作留给更合格的人。这就是说,我不会遇到任何人使用他们喜欢的任何工具将脚本放在一起,但是在一天结束时,它会被检入到颠覆中,或者它没有被部署。 – Mark 2010-08-30 16:36:32

+0

绝对同意你们,即使我们有时依然依赖IDE。感谢您的建议! – Igor 2010-09-02 21:44:49

2

我不会使用MySQL转储,因为它们主要用于数据备份,并且通常不使用版本控制来管理数据备份。相反,我只是版本控制安装脚本或用于设置初始数据库结构的SQL文件。

对于小型项目,我通常只需要一个名为install.sql的文件,其中包含我所有的CREATE语句和schema.txt其中描述的架构。对于大型项目,您可能想要使用类似dbForge的功能,它允许在专业版中进行数据库模式版本控制,但如果这就是您所使用的所有功能,则价格有点贵。

签出this article关于编码恐怖(特别是该帖子中的第一个链接)以获取更多指导。

+0

谢谢Lèse!在发布问题之前检查了这篇文章,并且会说必须仔细阅读它。 – Igor 2010-09-02 21:54:28

2

Depesz最近写了一篇博客文章的“HOW TO MANAGE CHANGES TO YOUR DATABASE?

我会说:

  • 如果你简单地存储在SVN每个对象的模式,你仍然需要部署具有顺序依赖和数据的变化修改,因此所有真正为你自己购买的东西都是对涉及对象的变化历史进行分类。
  • 编写脚本以执行所有更改,包括用于撤消更改的脚本。
  • 使用apgdiff生成(PostgreSQL)数据库模式差异。
+0

感谢分享! – Igor 2010-09-02 21:51:28

2

对于PostgreSQL数据库,您可以使用免费的Another PostgreSQL Diff Tool来比较您的开发架构和生产架构。您只需以您最适合的方式更新您的开发数据库即可。如果要将生产数据库更新为开发数据库状态,请执行开发数据库模式和生产数据库模式的转储,并让apgdiff进行比较。它将生成包含将生产数据库转换为开发数据库状态所需的DDL语句的输出。

事实上,如何将apgdiff部署到您的开发周期就取决于您使用DDL语句创建输出以将生产数据库“移动”到与开发数据库相同的状态。

在网站上您可以找到有关它如何工作,如何使用它,支持哪些语句等的信息。还有一篇关于PostgreSQL模式升级的文章,位于我的博客www.fordfrog.n​​ame(我被允许包括只有一个链接,所以不能使这个地址链接)。

+0

谢谢米洛斯拉夫回答!当然会检查你的博客。 – Igor 2010-10-07 13:11:06