代码和数据追踪/部署

10

长期以来,我们一直将数据保存在项目的代码库中。所有数据都存储在data/sql文件夹下,每个表格都有其自己的create_tablename.sql和data_tablename.sql文件。

现在我们已经将第二个项目部署到Scalr上了,我们意识到这有点混乱。

我们的部署方式:

我们有一个“packageup”脚本集合,它将项目分解为三个归档(数据、代码、静态文件),然后我们将它们分别存储在S3的三个不同桶里。

每当角色启动时,它会下载其中一个文件(根据角色:数据、nfs或web),然后“unpackage”脚本会为每个角色设置一切,将数据加载到mysql中,设置nfs等。

我们这样做是因为我们不想保存服务器镜像,我们总是从基础实例开始,使用各种内部构建的脚本从头安装所有内容。启动时间不是问题(我们可以在9分钟内准备好可用的农场)。

问题是,在尝试设置新的开发版本时,查找正确版本的数据库非常麻烦(在任何时候,我们都有大约4个开发版本的项目)。此外,随着sql文件的总计约为500mb,git在进入生产阶段后开始出现问题。

问题是:

其他人是如何管理数据库的呢?我一直在寻找一些使从生产中取出数据变得容易,并将数据从开发中迁移到生产中的工具,但并没有找到。


为什么你想要将数据从开发环境迁移到生产环境? - J. Polfer
1
@sheepsimulator - 许多框架(例如Magento,ATG等)将配置数据存储在数据库中,需要进行移植以复制开发/暂存环境。 - Jonathan Day
5个回答

4
你应该认真考虑使用dbdeploy(dbdeploy.com)。它被移植到许多语言中,其中最重要的是Java和PHP。它已经集成在像Ant和Phing这样的构建工具中,并允许轻松共享所谓的Delta文件。
Delta文件始终包含部署部分,但也可以包含撤销部分。当你提交你的Delta文件并且另一个开发者检查它时,他只需运行dbdeploy,所有新的更改都会自动应用到他的数据库中。
我正在使用dbdeploy来管理我的开源博客,因此你可以看一下Delta文件的组织方式:http://site.svn.dasprids.de/trunk/sql/deltas/

这里有一个关键点是“撤销”。任何体面的数据库部署过程都必须具备一步回滚功能,否则总有一天你会被抓住…… - Jonathan Day
看起来相当不错。此外,我可以将其分成两个分支(dev、prod),我们可以轻松地单独跟踪开发更改和生产更改,因为开发更改更有可能被还原,并且并不总是进入生产环境。我想知道它在这种情况下如何管理版本。 - Andrei Serdeliuc ॐ
嗯,由于增量文件通常包含特定功能而不是版本,因此您可以从版本控制中删除该增量文件,然后您就可以正常使用了(当然,在应用撤消部分之后,而不是之前)。 - DASPRiD

2
我的理解是您的主要问题是其他人在将SQL数据从开发环境迁移到生产环境中的经验。
我使用的是Microsoft SQL Server而不是MySQL,因此我不确定您是否可以直接使用我的经验。尽管如此,这种方式非常有效。
我使用Visual Studio 2010 Ultimate版比较两个数据库中的数据。同样的功能也存在于Visual Studio Team Edition 2008(或者Database edition)中。你可以阅读这篇文章了解它是如何工作的:http://msdn.microsoft.com/en-us/library/dd193261.aspx。你可以比较两个数据库(开发和生产环境),并生成修改数据的SQL脚本。你可以轻松地排除某些表或某些列进行比较。你还可以检查结果并从脚本生成中排除某些条目。因此,人们可以轻松灵活地生成用于在数据库中部署更改的脚本。你可以单独比较两个数据库的数据和结构(模式比较)。因此,你可以使用来自prod的数据刷新dev中的数据,或者生成修改prod数据库为dev数据库的最新版本的脚本。我建议你看看这些功能以及http://www.red-gate.com/的一些产品(例如http://www.red-gate.com/products/SQL_Compare/index.htm)。

0

看看 capistrano。这是 Ruby 社区用于部署到不同环境的工具,我发现它非常有用。

此外,如果您的部署开始出现问题,请尝试 Twitter 开发的一个工具叫做 Murder


我并不担心部署步骤本身,而是担心部署与生产/开发环境结合起来的情况。我们经常需要在彼此之间以及与线上环境共享数据库(结构+数据)。此外,Git 无法处理我们的 SQL 文件。 - Andrei Serdeliuc ॐ

0

个人建议可以考虑使用Toad

http://www.toadworld.com/

不到10k;)...将分析数据库结构,生成修改脚本,并进行数据迁移。


0

解决方案的一部分是在单个位置捕获每个代码模块及其相应数据资源的版本,并进行比较以确保一致性。例如,您的customer_comments模块版本号的增加将需要相应的SQL delta文件将相关DB表升级到相同版本号的数据。

例如,请查看@AlanStorm记录的Magento的core_resource方法

谢谢, JD


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接