logo

额外区块类型 (EBT) - 全新的布局构建器体验❗

额外区块类型 (EBT) - 样式化、可定制的区块类型:幻灯片、标签页、卡片、手风琴等更多类型。内置背景、DOM Box、JavaScript 插件的设置。立即体验布局构建的未来。

演示 EBT 模块 下载 EBT 模块

❗额外段落类型 (EPT) - 全新的 Paragraphs 体验

额外段落类型 (EPT) - 类似的基于 Paragraph 的模块集合。

演示 EPT 模块 滚动

滚动
01/10/2025, by Ivan

Drush 是 Drupal 的命令行外壳和脚本接口。使用 Drush 升级到 Drupal 8 是使用浏览器用户界面的替代方案。对于复杂站点的迁移,使用 Drush 升级到 Drupal 8 非常有用,因为它允许逐个运行迁移并支持回滚。

使用 Composer 安装 Drush

Drupal 8 站点可以使用 Composer 构建。如果您决定使用 drupal-composer/drupal-project 作为 Composer 项目模板,那么您已经拥有 Drush,因为它在项目的 composer.json 文件中被定义为依赖。

如果您的 Composer 项目中没有将 Drush 定义为依赖,可以通过以下命令行安装 Drush:

composer require drush/drush

注意:现在请使用 Drush 9

由于 Drush 10 存在问题,目前推荐通过 composer 安装 Drush 9:drush/drush:^9.0,这将安装到 9.7.2 版本。 

这样您将获得最新(稳定)的 Drush,它应当与最新的 Drupal 兼容。更多信息请参阅 Drush 与 Drupal 版本兼容性矩阵

检查 Drush 版本:

drush --version

Drupal 必需模块

要使用 Drush 进行迁移,您需要下载并启用以下附加模块:

  • Migrate Upgrade:为从 Drupal 6 或 7 升级到 Drupal 8 提供 Drush 支持。
  • Migrate Plus:为迁移引擎的基本功能提供扩展。
  • Migrate Tools:提供本页面稍后会用到的 Drush 命令。

重要! 请特别注意为这三个模块选择正确的版本。请查看项目页面,选择与您的 Drupal 8 核心版本兼容的版本。

有关不同升级模块的更多信息,请参阅 升级模块列表

定义源数据库

以下示例展示了如何定义您的 Drupal 6/7 源站点数据库的连接信息。如果您的源站点使用了数据库前缀,请务必提供前缀。您需要同时连接本地开发数据库(默认)和源数据库(D6 或 D7)。下面给出了 Lando 的示例,其中也包含了默认数据库配置以供参考。

注意: 为避免问题,重要的是将迁移数据库键命名为 migrate,参见 迁移时 Drupal 7 核心字段错误问题

settings.php 中的数据库连接示例

$databases['default']['default'] = [
  'database' => 'drupal8',
  'username' => 'drupal8',
  'password' => 'drupal8',
  'prefix' => '',
  'host' => 'database',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',
];

$databases['migrate']['default'] = [
  'database' => 'drupal7db',
  'username' => 'drupal7db',
  'password' => 'drupal7db',
  'prefix' => '',
  'host' => 'd7db',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',
];

Example .lando.yml

name: mywebsite
recipe: drupal8
config:
  webroot: web

# 创建 Drupal 7 数据库服务,可以考虑添加 phpmyadmin
services:
  d7db:
    type: mariadb
    creds:
      user: drupal7db
      password: drupal7db
      database: drupal7db
    portforward: true

导入 Drupal 7 数据库,假设数据库转储文件名为 mywebsite_db.sql.gz 并位于当前文件夹:

lando db-import --host=d7db --user=drupal7db mywebsite_db.sql.gz

灵感来源:https://github.com/thinktandem/migration_boilerplate.

使用 migrate-upgrade 生成迁移

Migrate Tools 模块会添加 Drush 命令,例如 drush migrate-statusdrush migrate-import。完整命令列表见本文档底部。

如果您在未做任何操作时尝试运行 drush migrate-status,不会看到任何可用的迁移。这是因为必须先基于源数据库生成迁移。由于 Migrate 不知道使用哪个源,因此迁移尚未生成。

要生成迁移,您需要使用由 Migrate Upgrade 模块提供的 Drush 命令 drush migrate-upgrade

通常您会希望只生成单个迁移,以便逐个运行。如果是这样,您需要使用 --configure-only 参数:

drush migrate-upgrade --legacy-db-url=mysql://user:password@server/db --legacy-root=http://example.com --configure-only 

其中:

  • 'user' - 源数据库的用户名。
  • 'password' - 源数据库用户密码。
  • 'server' - 源数据库服务器。
  • 'db' - 源数据库。
  • 'http://example.com' - 源站点根目录。如果源站点位于本地文件系统,可以使用 Drupal 根目录的路径作为此参数的值。此值将被附加到单个文件路径,用于查找并导入它们。

选项 --legacy-db-key 允许您使用 settings.php 中定义的 $database 数组键。

如果源站点使用了表前缀,您需要额外添加参数。例如数据库前缀是“drupal_”:

drush migrate-upgrade --legacy-db-url=mysql://user:password@server/db --legacy-db-prefix=drupal_ --legacy-root=http://example.com --configure-only 

如果不使用 --configure-only,drush migrate-upgrade 会先生成迁移并立即执行。

在使用 --configure-only 运行 migrate-upgrade 后,可以运行 migrate-status 查看可能的迁移列表:

drush migrate-status

然后您可以检查并选择性地执行这些迁移。要单独运行某个迁移:

drush migrate-import <migration name> 

要运行列表中的所有迁移:

drush migrate-import --all 

使用 migrate-manifest 启动特定迁移

您也可以使用 manifest 文件来定义要运行的迁移集合。这允许可重现地运行迁移组。此方法需要 Migrate Manifest 模块。安装后,您可以通过以下命令获取所有可用迁移列表:

drush migrate-template-list # Drush 8

drush migrate:template:list # Drush 9

注意:Migrate Manifest 目前与 Drush 10+ 并不完全兼容。

所需迁移在 YAML 文件中定义,如下所示。您只需列出所需迁移,Migrate Manifest 会提示您添加满足依赖所需的其他迁移。迁移可以按任意顺序列出,它们将按依赖关系正确运行。

# user 
- d6_user 
- d6_user_profile_field 
- d6_user_profile_field_instance 
- d6_user_profile_entity_display 
- d6_user_profile_entity_form_display 
- d6_profile_values:user 
- d6_filter_format 
- d6_user_role 
- d6_user_picture_entity_display 
- d6_user_picture_entity_form_display 
- d6_user_picture_file 
- d6_user_picture_field 
- d6_user_picture_field_instance 

# taxonomy 
- d6_taxonomy_vocabulary 
- d6_taxonomy_settings 
- d6_taxonomy_term 

# nodes 
- d6_node 
- d6_node_revision 
- d6_node_type 
- d6_view_modes 
- d6_filter_format 
- d6_field_instance_per_form_display 
- d6_field_instance_widget_settings 
- d6_field_formatter_settings 
- d6_field_instance 
- d6_field 
- d6_field_settings 
- d6_node_settings 
- d6_cck_field_values:* 
- d6_cck_field_revision:* 

# taxonomy fields 
- d6_term_node_revision 
- d6_term_node 
- d6_vocabulary_entity_display 
- d6_vocabulary_entity_form_display 
- d6_vocabulary_field_instance 
- d6_vocabulary_field 

# blocks 
- d6_block 
- d6_menu 

# custom blocks 
- d6_custom_block 
- d6_filter_format 

# book 
- d6_book 
- d6_book_settings 

# file migrations are configurable, see https://www.drupal.org/node/2257723 
- d6_file: 
    source: 
      conf_path: sites/assets 
    destination: 
      source_base_path: destination/base/path 
      destination_path_property: uri 

将 manifest 文件放在运行 Drush 时可访问的位置。建议将其保存在版本控制系统中,以便跟踪迁移的变更。

确保 manifest 文件列出的迁移所依赖的模块存在并在源站点启用(例如 d6_field 所需的字段模块)。否则执行迁移时会出现错误。

manifest 文件定义的迁移通过命令行运行,如下所示。替换数据库 URL 和 manifest 文件路径:

drush migrate-manifest --legacy-db-url=mysql://d6user:d6pass@localhost/drupal_6 manifest.yml 

Acquia Dev Desktop 用户注意事项

如果您使用 Acquia Dev Desktop 并且在其中有 Drupal 6 站点,默认数据库凭据是 drupaluser(无密码),数据库运行在 127.0.0.1:33067。这样,在命令中 --legacy-db-url=mysql://drupaluser:@127.0.0.1:33067/drupal_6 就能工作。数据库名假设为 drupal_6。如果连接有问题,请运行 drush status 检查这些值。

Drush 迁移命令参考

migrate-upgrade(无别名)

Migrate Upgrade 提供。用于从 Drupal 6/7 升级到 Drupal 8。此命令会基于源站点配置和内容生成迁移配置。

示例

drush migrate-upgrade --legacy-db-key=migrate

选项

  • legacy-db-url:源数据库的连接信息。
  • legacy-db-prefix:源数据库表前缀。
  • legacy-root:源站点路径,用于从文件目录迁移内容。如果文件是私有的,需要指定本地文件路径;公共文件也可以使用 http(s)。
  • configure-only:仅生成迁移配置。当此选项启用时,迁移会生成,但需使用 “drush migrate-import” 单独运行。

migrate-status (ms)

由 Migrate Tools 提供。用于获取所有迁移及其状态。

drush migrate-status

migrate-import (mi)

由 Migrate Tools 提供。用于执行迁移,常用于自定义迁移。

drush migrate-import migration_id
drush migrate-import --group=files

选项

  • all:运行所有已配置迁移。
  • group:运行某个组的所有迁移。
  • limit:限制迁移中每批处理的项目数量。
  • feedback:显示进度的频率。
  • idlist:逗号分隔的源 ID 列表。
  • update:迁移新项目以及源中已更新的项目。
  • force:强制运行操作,即使依赖未完成。

常见使用场景

  • 当使用 migrate-upgrade --configure-only 时,会创建配置对象。由于 Drupal 8 默认不允许覆盖现有配置,因此需要使用 migrate-import 来运行迁移。
  • 当创建并导入自定义迁移(通过配置管理 UI 或 drush config-import)后,需要使用 migrate-import 来运行。

migrate-rollback (mr)

由 Migrate Tools 提供。用于回滚迁移,常用于测试或重置。

drush migrate-rollback migration_id
drush migrate-rollback --group=files

migrate-stop (mst)

由 Migrate Tools 提供。用于停止活跃迁移。

drush migrate-stop migration_id

migrate-reset-status (mrs)

由 Migrate Tools 提供。用于将活跃迁移重置为等待状态。

drush migrate-reset-status migration_id

migrate-messages (mmsg)

由 Migrate Tools 提供。用于查看迁移过程中的消息,帮助诊断失败。

drush migrate-messages migration_id

migrate-fields-source (mfs)

由 Migrate Tools 提供。用于列出源可映射的字段。

drush migrate-fields-source migration_id