Migration 如何调试Drupal 8迁移中被忽略的项

Migration 如何调试Drupal 8迁移中被忽略的项,migration,drupal-8,Migration,Drupal 8,我使用migrate_升级模块创建了迁移脚本,但在迁移过程中有很多被忽略的项目,我尝试使用migrate tools中的drush mmsg,但对忽略的字段没有帮助,只是失败了 我不确定是否有“更合适”的方法来调查各个迁移作业的情况,但我只是查看我的migrate_*数据库表。它没有告诉我特定行失败的原因,但至少我能够准确地确定需要调查哪些行 在与您感兴趣的迁移作业相匹配的migrate_*表中,查找destid1值为NULL的行。如上所述,一旦标识了行,有时仍然很难找到。在我的案例中,它触发了

我使用migrate_升级模块创建了迁移脚本,但在迁移过程中有很多被忽略的项目,我尝试使用migrate tools中的drush mmsg,但对忽略的字段没有帮助,只是失败了

我不确定是否有“更合适”的方法来调查各个迁移作业的情况,但我只是查看我的migrate_*数据库表。它没有告诉我特定行失败的原因,但至少我能够准确地确定需要调查哪些行


在与您感兴趣的迁移作业相匹配的migrate_*表中,查找destid1值为NULL的行。

如上所述,一旦标识了行,有时仍然很难找到。在我的案例中,它触发了对以前导入的实体的更新,然后该实体抛出了一个行跳过异常

您可以通过观察
MigrateExecutable::import()
中的
while($source->valid())
循环,找出引发异常的原因。现在在198号线附近。在那里,它有一个try-catch,它将捕获异常,告诉它跳过该行

如果有调试器,请为跳过的ID设置一个监视,然后从异常中获取触发该ID的行和文件


如果您不这样做,就值得一次,但是您可以基于
sourceIdValues
添加
If
,并打印
$e->getLine()
$e->getFile()
获取引发异常的位置。

我的首选是使用xdebug和PHP异常断点来探索引发各种迁移异常时发生的情况。我使用PHPStorm,所以我使用Run>View Breakpoints菜单项来打开Breakpoints窗口。然后添加以下PHP断点:

  • Drupal\migrate\MigrateException
  • Drupal\migrate\MigrateSkipRowException(对于被忽略的行最有用)
  • Drupal\migrate\migrateskiprocessexception

  • 然后执行迁移(在此之前,您必须确保PHPStorm正在侦听并正确使用xdebug处理断点等)。当抛出其中一个异常时,PHPStorm停止调用。我使用Frames窗口浏览调用堆栈,查看随时间变化的变量。这使得在每一步中都可以很容易地识别字段和数据(源、目标、行等)。

    您正在从Drupal 7迁移到Drupal 8,并且在运行迁移后忽略了项。这就引出了一个非常重要的问题:哪些被忽略了

    你看到了什么 以上是我将在示例中使用的内容

    你想知道什么 哪些项目被忽略!?为此,我们可以查看数据库。我想你可以访问控制台

    数据库中的
    migrate\u map\u migration\u name
    表将为您提供所需的信息。将有一个名为
    源\行\状态的列
    。值2等于已忽略的状态。因此,运行以下MySQL命令:

    从“迁移映射节点表单”中选择*,其中源行状态=2;
    
    返回行的
    sourceid1
    列将包含被忽略项的id

    示例输出:

    +-------------------------------------------------------+-----------+---------+-------------------+-------------------+---------------+------+
    | source_ids_hash                                       | sourceid1 | destid1 | source_row_status | source_row_status | last_imported | hash |
    +-------------------------------------------------------+-----------+---------+-------------------+-------------------+---------------+------+
    | 8530eb5d63ad4cfea47134a28e3339e089f639164d218287c3... | 10931     | NULL    | 2                 | 0                 | 0             |      |
    +-------------------------------------------------------+-----------+---------+-------------------+-------------------+---------------+------+
    | ddd550e747c2a26a2a5058d49be0e146616fd5c45f6bef88f3... | 11656     | NULL    | 2                 | 0                 | 0             |      |
    +-------------------------------------------------------+-----------+---------+-------------------+-------------------+---------------+------+
    

    在我的例子中,它是一个静态映射插件,这是错误的。您所说的while循环现在位于MigrateExecutable.php的第198行。对$e->getLine和$e->getFile使用一些\Drupal::logger调用可以帮助我找出发生了什么。非常感谢!
    +-------------------------------------------------------+-----------+---------+-------------------+-------------------+---------------+------+
    | source_ids_hash                                       | sourceid1 | destid1 | source_row_status | source_row_status | last_imported | hash |
    +-------------------------------------------------------+-----------+---------+-------------------+-------------------+---------------+------+
    | 8530eb5d63ad4cfea47134a28e3339e089f639164d218287c3... | 10931     | NULL    | 2                 | 0                 | 0             |      |
    +-------------------------------------------------------+-----------+---------+-------------------+-------------------+---------------+------+
    | ddd550e747c2a26a2a5058d49be0e146616fd5c45f6bef88f3... | 11656     | NULL    | 2                 | 0                 | 0             |      |
    +-------------------------------------------------------+-----------+---------+-------------------+-------------------+---------------+------+