如何合并从网站的开发副本到实时网站的更改而又不丢失新内容?


40

将站点的开发副本上的工作合并到实时生产副本中的最佳过程是什么?自从开始开发最新功能以来,通常会在网站上添加很多新内容。而且,网站的大多数新增内容都会涉及数据库更改。因此,复制任何新文件都很容易,但是数据库呢?如何将更改与现有生产数据库合并,而又不丢失自上次更新生产站点以来添加的新内容?是否有任何模块对此有所帮助?


2
消除混乱:合并和迁移是两个不同的词。您在问题中都使用了这两种方法。如果活动站点为空,则需要将开发副本迁移到活动站点/主机。如果实时站点已经有内容,则需要将新内容从开发副本合并到实时站点(合并有些困难)。你需要做什么?
2011年

Answers:


16

对于开发人员站点上的内容类型,视图和结构更改,请查看使用功能将数据库导出为代码。

对于内容迁移,有很多选择,但是没有一个可靠的解决方案。一个示例是Deployment Suite


部署套件确实看起来很有趣,尽管它仍处于开发阶段(甚至还没有Beta版)。你自己用过吗?您是否知道无法覆盖的任何内容?
Chaulky 2011年

2

在这里,我基本上采用了两种思想流派(第三种思想流派,进行数据库比较,由于复杂度很高,我将不予讨论)。

1)通过删除生产数据库并导入开发数据库的mysqldump进行部署。(可选)预先在引用SQL转储中的dev URL的任何硬编码绝对链接上运行正则表达式查找/替换。将dev db导入prod后,自动运行SQL语句(通常通过脚本)以更改prod与dev不同的任何设置(例如,可能变量表中有一些连接设置,用于连接到您需要更改以指向产品外部系统而不是开发版本)。

2)如budda所述,将功能模块用于管理员设置,并将节点导出模块与内容删除模块一起用于内容导出/导入。因此,工作流程是:

  1. 使用node_export和功能将节点/功能导出到文件
  2. 可选(希望)版本控制
  3. 在产品系统上加载文件
  4. 使用drush或管理界面加载功能
  5. 使用drush delete-all或管理界面删除要导入类型的所有节点
  6. 使用drush ne-import或管理界面从导出的节点文件中导入节点。

值得一提的是,我强烈建议您采用一种标准的工作流程,其中的内容只能朝一个方向发展。开发->产品或产品->开发(我更喜欢这个)。

我已经做到了这一点,并且正在某些大型系统上做到了这一点,但效果相当不错,但是总会有很多方法可以切成这个苹果,选择哪种方法最适合您。


在选项1中,您如何重新创建已添加到实时站点中但不在开发站点中的内容?似乎您正在用dev db覆盖所有内容,然后可能更改了一些设置/变量。另外,您目前在您的网站上使用哪种思想流派?每种方法都有优点和缺点吗?
Chaulky 2011年

在选项1中,我们现在使用node_export定期发送内容(已删除了先前的内容)。我们曾经在dev和prod上进行内容更改。在我所见过的几个地方,这实际上是一种常见情况,尽管显然并不理想。这就是为什么我添加内容,采用指导并坚持下去的原因,要么内容进入dev-> prod要么prod-> dev,但尽量不要同时使用。是的,我们基本上覆盖了,尽管更像是擦除和重建。在我的新工作中,我们执行#2,在我的旧工作中,我们执行#1,但现在正在转到#2(我仍在为他们咨询)。
coderintherye11年

1

实时站点副本的转储数据库和SQL文件中站点的开发副本(两个转储使用相同的参数和设置)。
然后,使用小型比较工具ExamDiff比较两个SQL文件。它将以不同的颜色并排显示文件差异。您也可以直接跳至差异(无需滚动)。检查差异并在实时站点的SQL文件中添加/编辑行。确保该文件中没有开发环境的绝对路径/ URL。大功告成!是时候恢复活动站点的数据库了。
让您的生活更轻松:第一步,仅转储那些已更改的表。例如,如果您已在开发副本中编辑了一个针对单独表的模块,则仅转储该表。如果您不确定特定的表,则可以进行整个数据库转储。


在某些重要情况下,此技术有严格的限制。例如,如果开发站点具有新节点,则您的两个数据库都将包含具有相同节点ID的条目,并且将无法解析引用并从sql数据库的文本转储中合并它们。如其他答案中所述,可以通过功能和部署更好地处理这种操作。
greg_1_anderson
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.