清除数据库中的已删除字段


9

我已经创建了将其删除的字段。字段的表在删除后就消失了,但它们仍在field_configfield_config_instance

反正有清洁的地方吗?

谢谢

Answers:


10

中的条目field_config,并field_config_instance可能有值1deleted列。

这意味着它们已被标记为删除,但实际上直到运行cron才被删除(删除的字段数据已在中清除field_cron())。


你是男人。我没有安装phpmyadmin,所以我没有通过ssh连接检查这两个表的其他列。感谢Clive
lusketeer 2012年

11

使用拉丝:

$ 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

如果出现空白,则可以安全删除那些剩余的表


这是一个很好的答案,谢谢@ decibel.places!
joelpittet

6

作为运行cron删除已删除数据的替代方法,可以手动运行field_purge_batch($ batch_size)

要手动运行该功能,您可以:

  • Bootstrap Drupal在php文件中
  • 创建菜单挂钩页面回调
  • 如果您已安装devel模块,请访问/ devel / php

使用的$ batch_size取决于您的服务器环境和需求。我使用的值低到5,最高到10000。


4

对于那些Drupal 8用户,

我也经历了这一点,挖掘代码。我发现了以下所有原因导致字段删除后仍未删除的所有原因:

  • 执行cron gazillion次
  • 运行drush eval“ field_purge_batch(500)”百万次

字段持续存在,不会消失,这是由于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答案!对于多个问题,请不要复制粘贴相同的答案。如果它们是重复项,请将其标记为重复项。
kiamlaluno

-1

似乎找不到任何解决方案。因此,我最终手动从这两个表中删除了它们。


这也发生在我身上:在生产环境中创建字段,并将其复制到测试系统。恢复生产中的字段,然后再次复制到测试系统。Cron可能在此期间运行,因此,由于未正确删除/重新创建测试数据库,因此保留了两个剩余的数据表和修订表...结果:*在备份之前始终运行cron *导入测试数据库时,始终拖放并创造
击败克里斯汀·克里斯汀

drupal.org/node/1351506这仍然是一个已知问题。
凯文·摩尔斯

-1

如果您运行了几次drupal cron,drupal将删除字段表及其内容。您可以按照以下步骤轻松运行cron几次,但是此步骤可能会阻止您的系统,Web或托管,但是如果您控制系统,则可以这样做。

  1. 转到Drupal状态页面(管理员/报告/状态)。
  2. 在页面下方,您会看到“手动运行cron”之类的内容以及“从外部运行cron”之类的链接以及带有cron_key参数的链接。复制此链接。
  3. 转到终端(Linux或Mac终端)。
  4. 编写下一个bash命令:

    虽然是真的 卷曲[将复制的链接放在此处,删除括号];完成

  5. 按回车。该命令将无限次执行。

  6. 您可以像phpmyadmin这样进入数据库,并查找“删除”命名表。您可以看到行是如何删除的,以及如何删除。当名称中所有带有“删除”的表都为空时,它将被删除。如果在数据库中看不到任何已删除的表,则可以转到最后的7步。
  7. 在终端中停止了bash命令。您可以按Ctrl + C键。如果不能,请关闭终端。

正如我之前评论的那样,这不是最好的解决方案,但它很简单,可以正常工作,您不会做错任何事情,因为您只运行了drupal cron,因此,可以用一些错误的php代码破坏任何东西。否则,您可以使网络中的服务器,系统,主机或其他任何东西都饱和,因为此步骤通常会执行cron,这会消耗网络资源,但是如果您拥有资源的控制权,那就没有太多了清理表或行,或者您知道可以安全地为系统执行此操作,则可以执行此操作。

而且我知道,这不是最佳解决方案。但这行得通。也许这是针对您的情况的简单且最佳的解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.