【问题标题】:Drupal 7 -> 8 migration of a large database takes foreverDrupal 7 -> 8 大型数据库的迁移需要很长时间
【发布时间】:2017-06-27 15:34:21
【问题描述】:

所以我有一个拥有 200 万用户的 Drupal 7 数据库,需要以最少的停机时间迁移到 Drupal 8(目标是一小时)。 Drupal 迁移模块似乎解决了这个问题,但它一次写入一个新行,在我的测试中,4000 个用户 + 相关数据在坦率地说野兽般的 AWS 实例上花费了 20 分钟。外推到完整的数据集,我需要 7 天的时间来运行迁移,而这样的停机时间是不合理的。

我针对 Drupal 核心创建了一个feature request,但我也想看看社区是否有我错过的任何想法。另外,我想就这个问题展开一些讨论。

【问题讨论】:

  • 您需要移动整个数据库还是只移动用户?否则,您可以转储必要的表(或整个数据库,但要准备好转储几 GB)。创建一个新数据库,将转储导入新数据库,然后更改站点凭据以使用新数据库。顺便说一句,Drupal 很新,所以这可能都是废话:p
  • 用户的存储方式在 Drupal 7 和 Drupal 8 之间发生了变化。每个用户都需要对其进行一些逻辑处理,然后才能将它们放入新的数据库中:)
  • 啊,这真是太糟糕了。也许您可以编写自己的迁移脚本?查看迁移模块并编写您自己的脚本。您仍然可以关注我的第一条评论,但不是转储和导入,而是通过脚本读取和输出。
  • 我的意思是,这就是我现在正在做的事情。它确实需要我重新实现实体保存逻辑,但作为批量 SQL 请求。我希望有更好的方法。
  • 也许有,但我不知道..

标签: database drupal drupal-8


【解决方案1】:

如果有人仍然关心这个,我已经解决了这个问题。进一步的研究表明,Drupal 迁移模块不仅一次写入一个新行,而且一次从源读取一行。此外,对于每一行,Drupal 都会写入源表的映射表,以便支持回滚和更新。

由于用户的数据存储在每个自定义字段的一个单独的表中,这会导致每个用户进行 8 次读取和 16 次写入。

我最终扩展了 Drupal 的 Migration Executable 以运行该流程。然后我覆盖了读取数据的部分和写入数据的部分以批量完成工作,并且不写入映射表。我相信我的预计时间现在已经缩短到不到一个小时(速度提高了 168 倍!)。

不过,尝试使用 Drupal 基础架构的麻烦比值得的多。如果您自己这样做,只需编写一个命令行应用程序并手动执行 SQL 查询。

【讨论】:

    猜你喜欢
    • 2020-10-03
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    相关资源
    最近更新 更多