Drupal 升级指南:从 Drupal 6 升级到 Drupal 7

  本手册参考 Drupal 7 发行包里面的 UPGRADE.txt 文档及 Drupal 在线文档,详解 Drupal 6 到 Drupal 7 的升级过程。

 

Drupal 6 到 Drupal 7 升级规划

  在进行网站升级之前,还有一大堆事情需要先做。在升级前了解已有网站如何建设是非常重要的。在真正升级站点之前在开发环境先进行测试是最好不过的了。

现有模块和主题

找出网站上安装的模块(包括那些已安装,但之后被禁用的模块)

找出网站上安装和使用的主题

将这些模块和主题列成一张清单,这样有利于升级时进行核对,这份清单还为升级过程中禁用和重新启用模块带来方便。

 

禁用和卸载未使用的模块

当对网站中的模块进行完调查之后,能够知道哪些模块实际上并未使用。出于安全性和性能的考虑,我们总是推荐将未使用的模块卸载并移除。

 

第三方模块升级

在升级前调查关于模块的情况:

  1. 这个模块是否有 D7 版本?通过访问模块项目页面,就可以轻松的获知这一信息。
  2. 这个模块是否被整合到 D7 核心?不少实用的模块都被整合到 D7 的核心,详情可参考《整合到 Drupal 7 核心的 Drupal 6 模块
  3. 这个模块是否可以升级到 D7 版本?(有些模块有多具版本,如 6.x-1.x 和 6.x-2.x,但其中只有一个版本能够升级到 Drupal 7)
  4. 这个模块的 D7 版本是否增加了一些新的依赖性?有时新版本的模块需要依赖其它的一些模块(例如 D7 版本的 Views 模块依赖于 ctools 模块,而 D6 版本并无此依赖性),因此确保升级时加上依赖的模块。

 

主题升级

如果网站使用了第三方的主题,就需要研究主题是否能升级到 Drupal 7

  1. 这个主题是否有 D7 版本?
  2. 网站的主题是否基于一些基主题(如 Zen 或 960)?这样的主题应该如何进行升级?

如果网站的主题是自定义开发,或者修改自第三方的主题,则需要考虑到主题升级将会花上一些时间,可参考《Converting 6.x themes to 7.x

 

内核及第三方模块的修改

使用 Drupal 的原则之一就是“绝对不要修改内核”,然而有时确实更改了内核的一些文件和模块。对于这些修改,进行操作的人应该承担起进行标注和升级的责任。对于第三方模块的修改也是如此。

 

创建升级规划文档

基于之前对于网站中模块和主题的调查创建网站升级规划文档,文档应包含《从 Drupal 6 升级到 Drupal 7 步骤详解》中的所有步骤。因为升级过程中有许多事情很可能会被遗漏,创建一份核对清单,便于自己查看升级完成的项目和跟踪进度,而且能够节省很多时间。将升级过程中遇到的问题做一些记录,这对以后再进行升级操作是非常宝贵的资源。

以下内容可以考虑加入到文档中:

  • 不能进行升级的模块的其它选择
  • 哪些模块在升级数据库,需要先完成自身的升级
  • 对升级有特殊要求的模块的相关说明
  • 模块升级的顺序
  • 升级是否成功的测试计划

 

参考文档:Make an Upgrade Plan

从 Drupal 6 升级到 Drupal 7 步骤详解

  对 Drupal 版本进行升级之前,建议先检查第三方代码与自定义代码与新版本的兼容性,在完成这些检查并了解新旧版本的可升级部分之后,便可通过以下步骤开始升级了。

  1. 检查第三方及自制模块、主题与 Drupal 7 的兼容性[1],(如果你是开发人员,还应该了解如何对你的代码进行升级[2][3])
  2. 确保你目前使用的是最新版本的 Drupal 6.x(当前为 Drupal 6.20),如果当前不是使用最新版本的 Drupal 6,请先升级到 Drupal 6.20。可以参考 Drupal 6.20 发行包里面的 UPGRADE.txt 文档,或者是我以前译写的针对 6.x 版本间升级的《Drupal 的升级步骤
  3. 使用 UID 1 用户登录到站点
  4. 打开 Administer > Site configuration > Site mainenance,将“站点维护”更改为“离线”并保存配置
  5. 打开 Administer > Site building > Themes,启用"Garland"并将其设置为默认主题
  6. 打开 Administer > Site building > Modules,禁用所有第三方及自制模块。因为模块之前存在依赖关系,所以可能需要重复多次才能禁用所有的第三方和自制模块。如果你确定其中部分模块以后不会在 Drupal 7 中被使用,那么可以在禁用之后将其“卸载”;
  7. 通过命令行或FTP删除以下文件:
    sites/default/default.settings.php
  8. 除了 sites 文件夹和其它由你添加的文件,删除 Drupal 安装目录内其它的所有文件和文件夹。如果你对 .htaccess 或 robots.txt 进行的更改,则应该在稍后重新更改新版本的 .htaccess 和 robots.txt 文档,以保证满足你的需求;
  9. 如果在第6步中卸载了某些模块,你应该将此模块文件从 sites/all/modules 或 sites/*/modules 中移除。但不要删除其它模块,即使它们与 Drupal 7 还不兼容,我们将稍后再处理
  10. 从 http://drupal.org 下载最新版的 Drupal 7.x 发行包,将它解包到你的网站根目录
  11. 重新修改在 Drupal 6 中修改过的核心文件,如 .htaccess 和 robots.txt
  12. 将 settings.php 的权限改为可写,从而保证它能够被升级到 Drupal 7 格式。settings.php 文件通常位于 sites/default/settings.php
  13. 通过浏览器访问 http://www.example.com/update.php 执行更新脚本 update.php(注意将其中的 example.com 改为你的站点域名)。如果无法访问 update.php,请执行以下操作:
    - 使用文本编辑器打开 settings.php
    - 找到以下内容:
      $update_free_access = FALSE; (将 FALSE 改为 TRUE)
    注意:千万记得更新完成之后将这个选择改回 FALSE;
  14. 执行完以上更新脚本便完成了 Drupal 核心的更新,备份一下更新后的数据库;
  15. 参考《升级第三方模块及主题》[4]重置和更新非核心的 Drupal 模块及主题;
  16. 访问 Administration > Reports > Status,确保所有内容都工作正常;
  17. 确保 settings.php 文档中的 $update_free_access = FALSE;
  18. 访问 Administration > Configuration > Development > Maintenance mode,取消“将站点设为维护模式(Put site into maintenance mode)”,并保存配置;

  执行完以上步骤,便完成了 Drupal 6 到 Drupal 7 的升级操作,有关 Drupal 7 的管理功能介绍,可参考 http://drupal.org/getting-started/7/admin

  到目前为止,以上步骤只完成了 Drupal 核心文件从 6.x 到 7.x 的升级,对于个别模块的升级,请单独参考模块对应的 7.x 版本中的 UPGRADE.txt 文件,并根据模块作者的说明进行升级。

参考资料:

  • [1] 已经拥有 Drupal 7 版本的模块列表 - http://drupal.org/node/895314
  • [2] 开发人员-升级模块 - http://drupal.org/update/modules
  • [3] 开发人员-升级主题 - http://drupal.org/update/theme
  • [4] 升级第三方模块及主题 - http://drupal.org/node/948216

Drupal 6 升级到 Drupal 7 注意事项及技巧

  本文档记录 Drupal 6 升级到 Drupal 7 的一些注意事项和处理技巧,从而避免在升级过程中遇到一些常见问题。

注意事项:

  • 禁用所有主题,并将 Garland 设为默认主题
  • 禁用所有第三方模块和自定义模块

如果没有执行以上操作,常常会出现找到不指定函数而导致网站无法打开的情况,因此在执行升级前,请确保禁用了所有的主题和模块。

如果升级之后网站不能打开,查看 Web 服务器日志,一般能够定位到出问题的原因。

技巧:在升级之后发现有模块和主题没有禁用,可以通过修改 Drupal 数据库中 system 表中 status 列的值来设置主题或模块的状态(并不推荐这个办法,但这样做确实能解决一些问题。大家最好还是在进行升级前确认禁用了所有第三方和自定义的模块和主题)

 

如果网站数据较多,升级过程会变得十分漫长,可能会长达几个小时,因此在进行数据库更新之前,可以:

  • 清空数据库中所有 cache 开头的数据库表
  • 清空数据库中所有 search 开头的数据库表

说明:cache 开头的数据库表都是缓存数据,search 开头的数据库表保存是的搜索相关的索引数据,尤其是 search_index 表中的数据量巨大(几百万、千万、上亿)。这些表中的数据都是可以自动再生成的内容,因此清空这些表对于减少数据库体积十分有效果。

注意:有关清空所有 search 开头数据库表的作法并不知道有没有什么副作用,有顾虑的朋友请进行一些研究。(cache 开头的表可以安全清空)。

 

技巧:对于中大型网站,建议使用 drush 来执行数据库更新操作(drush updatedb),因为对于数据库的升级可能长达几个小时,通过访问 update.php 来执行升级操作可能出现PHP脚本执行超时和AJAX的错误。

 

如果您在升级过程中遇到其它一些常见问题,欢迎分享您的经验或者提问 :)

备份 Drupal 数据库与文件

  执行 Drupal 升级进行之前,请务必先备份好所有的文件和数据库。因为,如果升级过程中出现任何问题,除了使用备份,没有其它更好的办法让你的站点恢复原状。并且,如果在升级过过程中遇到任何错误,都不应该再执行任何更进一步的操作。

备份数据库:

  备份 Drupal 数据库,可根据用户的实际情况使用命令行或者 PhpMyAdmin 进行备份。因为 PHP 脚本有最大执行时间限制,因此在使用PhpMyAdmin备份较大的数据库文件时可能会因超时而导致备份失败。MySQLDumper 和 Bigdump 是两个可选的数据库备份工具。

备份文件

  升级 Drupal 前需要备份的文件包核心文件与非核心文件,核心文件即为 Drupal 发行包中包含的文件,非核心文件通常是指第三方模块、第三方主题或其它用户生成的文件,默认情况下,这些非核心文件都位于Drupal安装目录的 sites 目录下。

  所以升级之前,应该备份 Drupal 数据库与 Drupal 安装目录下的所有文件,以确保升级出错后可以使用这些备份来还原站点。

 

参考文档:

  • Make Backups - http://drupal.org/upgrade/backing-up-the-db
  • Backing up a site - http://drupal.org/node/22281

整合到 Drupal 7 核心的 Drupal 6 模块

  本文档提供了一份模块清单,这些模块有 Drupal 6 版本,在升级到 Drupal 7 之后,这些模块的功能已经部分或已完全被整合到 D7 的核心了。

  以个列表还在不断更新,因此并非最终版本,最新版本的原文可以查看《Drupal 6 contributed modules that are in Drupal 7 core

可卸载的模块

以下这些模块的功能已经包含在 Drupal 7 的核心中,它们的升级不涉及数据迁移。当网站从 D6 升级到 D7 时,可以将这些模块从模块目录下移除。升级完成后,可能需要对这些模块进行重新配置以便恢复 D6 时的功能。(对于包含复杂配置的模块,我们也希望模块维护人员提供自动化升级能力)

 

其它可卸载的模块(视所使用的功能而已)

以下模块的部分功能被集成到 D7 核心,但其自身仍然具备一些额外的功能,如果你没有用到这些额外的功能,则可以卸载这些模块。

  • Token
    - 此模块依然是 D7 版本,用于提供一些token的用户界面(UI)功能,如 field 和 profile tokens.
  • Better Formats
    - 核心以外的 D7 版本的此模块具备以下功能:基于用户角色显示: 输入格式提示, 输入格式提示链接及 format selection for [entity]

 

包含数据迁移的模块

以下这些模块在站点升级时需要被保留,首先需要完成《从 Drupal 6 升级到 Drupal 7 步骤详解》中的所有步骤,然后安装一些处理数据迁移的辅助模块。

  • Content Construction Kit (CCK)
    - 除了整合到 D7 核心之外,CCK 中的一些功能被做为独立的模块发布出来,其中包含了数据迁移的功能,如 Node 和 User references 的功能包含到 References 模块中. Content permissions, fieldgroups 及 content copy 也被做为独立模块发布。
  • Content Taxonomy
    - 需要迁移数据,模块的项目页面提到将提供数据迁移功能。
  • Date Timezone
    - 这是 Date 的子模块之一.
  • Field Taxonomy
    - 需要迁移数据,目前项目页面没有提到自动化数据迁移功能的消息
  • Filefield/Imagefield
    - 这两个模块的数据迁移的初步方案是借助 CCK 的 Content Migrate 模块
  • Image
    - 相关的图片节点(Image Nodes)需要使用 Field Converter 模块迁移到 FieldAPI. 部分功能(如:导入)依然存在于独立的模块中。
  • Taxonomy Delegate
    - 需要迁移数据,目前项目页面没有提到自动化数据迁移功能的消息
  • Taxonomy Intro
    - 需要迁移数据,目前项目页面没有提到自动化数据迁移功能的消息
  • Term fields
    - 需要迁移数据,目前项目页面没有提到自动化数据迁移功能的消息

 

参考文档:Drupal 6 contributed modules that are in Drupal 7 core