Answers:
中的条目field_config
,并field_config_instance
可能有值1
的deleted
列。
这意味着它们已被标记为删除,但实际上直到运行cron才被删除(删除的字段数据已在中清除field_cron()
)。
使用拉丝:
$ drush eval "field_purge_batch(500)"
您可能必须运行几次,或者增加$ batch_size,即使运行cron之后,仍然可能会有field_deleted和field_deleted_revision表
询问
SELECT * FROM `field_config` WHERE `deleted` = 1
SELECT * FROM `field_config_instance` WHERE `deleted` = 1
如果出现空白,则可以安全删除那些剩余的表
作为运行cron删除已删除数据的替代方法,可以手动运行field_purge_batch($ batch_size)。
要手动运行该功能,您可以:
使用的$ batch_size取决于您的服务器环境和需求。我使用的值低到5,最高到10000。
对于那些Drupal 8用户,
我也经历了这一点,挖掘代码。我发现了以下所有原因导致字段删除后仍未删除的所有原因:
字段持续存在,不会消失,这是由于field_purge_batch中的逻辑所致
// We cannot purge anything if the entity type is unknown (e.g. the
// providing module was uninstalled).
// @todo Revisit after https://www.drupal.org/node/2080823.
if (!isset($info[$entity_type])) {
continue;
}
依赖的模块将被卸载。这就是为什么不删除字段的原因。
如何解决呢?建议您先重新安装模块,然后清除这些字段,然后再卸载,这是建议的方法。要找出您需要重新安装的模块:
$fields = entity_load_multiple_by_properties('field_config', array(
'deleted' => TRUE,
'include_deleted' => TRUE,
));
dpm($fields); // this is devel module of var_dump
// check the protected member called "dependencies"
如果您不想采用那种重新安装模块的方法,您也可以立即删除,我不确定这是什么行为,但是应该可以完成工作。
先备份!!!
是的,不要偷懒,如果出现问题,它将节省您的屁股。
$fields = entity_load_multiple_by_properties('field_config', array(
'deleted' => TRUE,
'include_deleted' => TRUE,
));
foreach ($fields as $field) {
$field->delete();
}
// Retrieve all deleted field storages. Any that have no fields can be purged.
$deleted_storages = \Drupal::state()->get('field.storage.deleted') ? : array();
foreach ($deleted_storages as $field_storage) {
$field_storage = new FieldStorageConfig($field_storage);
$fields = entity_load_multiple_by_properties('field_config', array('field_storage_uuid' => $field_storage->uuid(), 'include_deleted' => TRUE));
if (empty($fields)) {
field_purge_field_storage($field_storage);
}
}
最后一次做cron。我希望它能解决这个问题:)
似乎找不到任何解决方案。因此,我最终手动从这两个表中删除了它们。
如果您运行了几次drupal cron,drupal将删除字段表及其内容。您可以按照以下步骤轻松运行cron几次,但是此步骤可能会阻止您的系统,Web或托管,但是如果您控制系统,则可以这样做。
编写下一个bash命令:
虽然是真的 卷曲[将复制的链接放在此处,删除括号];完成
按回车。该命令将无限次执行。
正如我之前评论的那样,这不是最好的解决方案,但它很简单,可以正常工作,您不会做错任何事情,因为您只运行了drupal cron,因此,可以用一些错误的php代码破坏任何东西。否则,您可以使网络中的服务器,系统,主机或其他任何东西都饱和,因为此步骤通常会执行cron,这会消耗网络资源,但是如果您拥有资源的控制权,那就没有太多了清理表或行,或者您知道可以安全地为系统执行此操作,则可以执行此操作。
而且我知道,这不是最佳解决方案。但这行得通。也许这是针对您的情况的简单且最佳的解决方案。