将一个/两个Drupal安装中的内容导入到新的Drupal安装中

时间:2009-10-18 10:45:12

标签: sql mysql drupal

我们正在将一个大型站点opendemocracy.net从Drupal 4.7升级到Drupal 6.我们现有的安装在数据库中有许多多余的表,这些表是我们不会使用的曾经使用的模块:理想情况下,我们不会保留这些或我们的旧块等等。这是因为:(a)保持数据库尽可能小是好的,(b)从ID 1开始新块是好的,等,(c)尽可能清洁安装应尽量减少任何问题(例如,我们的旧安装有一些奇怪的问题,例如不让我们创建任何新的块)。

我们真正想要保留的是我们的节点(加上评论),分类,文件,统计信息,用户,路径别名和一个自定义表。我已经尝试将我认为管理的表格(在本问题末尾列出)复制到一个全新的4.7安装中,然后从中进行升级,它似乎可行。我的问题是:这会有用吗?这是个好主意吗?有没有更好的方法来实现一些相同的目标?

另外,如果我们需要对另一个安装执行相同的操作,并将其内容添加到同一个新安装中,该怎么办?我们为论坛单独安装。以下方法似乎有效,但是我担心在创建新内容到达我创建的新nids时会出现问题(Drupal如何检查哪些nid是免费的;是否有我应该更改的数据库变量?):< / p>

  1. 通过主安装中的最高nid(或vid)增加论坛安装的节点和term_nodes表中的nids(和vids)
  2. 在主安装中创建一个新的词汇表,其中包含与论坛安装中的论坛词汇相同的术语(在maininstall.com/admin/content/forum - 我不知道如何指定这是论坛词汇表)
  3. 将论坛安装的term_nodes表中的tid更改为主安装中此新词汇表中术语的tid值
  4. 将论坛安装的已修改节点和term_nodes表的内容插入主安装的node和term_nodes表中。
  5. PS:以下是我发现需要复制的表格:

    audio, audio_attach, audio_image, audio_metadata, comments, files, node, node_access, node_comment_statistics, node_counter, node_revisions, node_type, od_story, term_data, term_hierarchy, term_node, term_relation, term_synonym, url_alias, users, vocabulary, vocabulary_node_types
    

3 个答案:

答案 0 :(得分:3)

我在第一部分并不完全赞同杰里米。您必须非常小心地在Drupal数据库中进行混搭。有时候事情似乎有效,但后来你发现自己已经为自己创造了很多问题,因为你删除了一个在另一个表中引用的东西。你的块的id号也真的不会影响Drupals创建新块等的能力。如果你想要“漂亮”的ID,请确保你彻底测试了一些东西。但考虑到成本/收益,这绝对不值得。

你创建一个新的4.7然后从那里升级的策略应该工作得很好。但是,我建议您先将数据库复制到当前发行版的副本中,然后停用并卸载您不会使用的所有模块。这将删除与这些模块关联的所有数据,并且还应该帮助清理表,以防更改了您正在使用的表。这可能没有做任何事情,但它可以帮助清理您正在使用的数据。

当Drupal创建新节点时,它只是执行SQL INSERT,因此它是处理id的数据库。所以你不需要了解这一点。 Jeremy建议的migrate模块应该能够帮助您将数据传输到新的Drupal安装中。如果你想写一个剧本,那你的建议似乎没问题。

注意
尽可能多的升级指南和upgrade handbook说。在进行重大升级时,您应该始终升级所有主要的Drupal版本(例如4到5,5到6 ......),直到达到目标。原因是内部结构以及数据库模式在每个主要版本中都会发生变化。因此,您需要在版本5中的数据结构中进行更改,才能成功升级到版本6.我没有在我的原始帖子中提到这一点,因为这是为了常识,但提及没有可能是个好主意。越少。

另一件值得注意的事情是,正如Henrik O正确指出的那样,您可以更改数据库中的AUTO_INCREMENT值。我不记得4.x升级,但我相信Drupal将在4-5升级的一部分中处理这个问题,因为它在该版本中实现了串行表,而不是管理它本身。另外,是否运行查询以更改AUTO_INCREMENT取决于数据库后端,因为并非所有后端都使用此属性。 PostgreSQL不会以这种方式管理连续出版物,所以它应该自动开始创建具有正确nids的节点,如果你将它用于Drupal。

答案 1 :(得分:3)

我会说你的基本方法很好,但是对于默默打破的事情你是正确的。您的主要关注点确实应该是引用完整性,因为自4.7版本以来id处理已更改。最初,Drupal没有使用数据库引擎的自动增量/串行功能,而是通过序列表执行自己的id生成。他们在Drupal 5中切换到连续剧,但由于某种原因,我不记得他们仍然保留了序列表,直到它在第6版中删除。

因此,如果我在你的位置,我会先添加一个中间步骤并升级/迁移到Drupal 5安装,然后再进行另一次升级到Drupal 6.原因是升级过程或多或少都是调整后的操作集合,使用有麻烦的用户输入进行了优化。由于大多数错误报告来自仅进行“1版”升级的用户,因此采用相同的路线应尽量减少遇到意外错误/条件的可能性。

此外,您的post on drupal.org显示您要“合并”的论坛实例是Drupal 5安装,因此您可以在迁移的中间Drupal 5'阶段进行合并。 (或者,我将该实例单独升级到Drupal 6,然后再将其合并到主实例中。)

对于Drupal中的id调整&gt; = 5,您需要明确调整每个受影响的表的AUTO_INCREMENT起始值。例如在MySQL中,发布:

ALTER TABLE node AUTO_INCREMENT = 5432;

将告诉节点表从现在开始在5432开始设置新的连续出版物(ids)

(注意:AUTO_INCREMENT是MySQL的处理方式,如果使用PostgreSQL,请查看documentation for the serial 'pseudo' type和随附的序列生成机制)

显然,您需要彻底测试新实例。重点关注测试新数据的插入以及更新现有数据(节点,术语,迁移的任何内容),因为这会显示参照完整性的错误。

要彻底,你应该没事 - 祝你好运:)


编辑:您还应该仔细检查“变量”表条目,因为其中的某些设置可能包含对“标准”表条目的ID的引用(例如词汇表vid,术语tid或类似的内容 - 在您的情况下尤为forum_nav_vocabularyforum_containers

答案 2 :(得分:1)

如果你创建一个更干净的基础安装的方法似乎工作,那么坚持下去。

对于问题的第二部分,您可以考虑migrate模块。它被设计为从非drupal cms复制到drupal,但应该能够帮助你将drupal内容添加到另一个drupal站点。