删除13000个节点


9

我在Drupal 7站点中有大约13000个要删除的节点。我尝试过“ 视图批量操作”模块一次删除500个节点,但是超时。我一次只能删除50个节点。

如何一次删除50个以上的节点?


曾经有“批量删除”模块,但是过时了以支持VBO anwyay。但是VBO似乎支持批处理。您是否尝试过使用它?
Mołot

1
如以下答案所示,VBO可能是可行的方法。在需要删除比这种情况更多的节点的时候,我所做的就是调用hack模块来忽略我不需要的许多钩子调用。(我最严重的违法者是apache solr)。这可以大大加快工作速度,但是显然必须格外小心。
Letharion

Answers:


16

VBO是批量删除节点的事实上的标准,根本没有更好的方法。

由于VBO是成批处理的,因此一次只能处理1个(或几个)节点。因此,如果您收到超时错误,则这些错误与删除单个节点有关,而不与整个批处理操作有关。

像这样的标准解决方案是增加PHP的最大执行时间来进行补偿。


2
只需完成答案即可:您可以选择要为该工序选择多少个实体。根据我的经验,使用100可以在大约1分钟内完成。
AyeshK 2013年

7

安装Devel。然后转到D7中的admin / config / development / generate / content并选择所有内容类型。选中“删除所有内容”。在“您要生成多少个节点?”中输入0。

单击生成。

这将删除所有节点。


1
@Mołot“ 检查‘删除所有内容’ ” ... “中输入0‘你会多少节点要产生?’” ......;)
克莱夫

@Clive好,我的错,对不起。
Mołot

1
具体来说,是由Devel Generate模块完成的;它随Devel一起提供,但是如果仅启用Devel,则不会获得此功能。如果您不想删除所有内容,则还可以通过这种方式轻松删除特定内容类型的所有节点。如果您仍然遇到PHP超时并且不担心CLI的问题,也可以使用Devel Generate随附的Drush generate-contentgenc)命令。drush help genc有关使用信息。
Garrett Albright

3

使用VBO并从Drush执行。规模测试后,我使用以下方法删除了超过150万个节点。

  1. 用页面创建一个新视图。适当设置过滤器,以仅显示您要删除的节点的类型。
  2. 添加一个新字段:“批量操作:内容”
  3. 选中“选定的批量操作”下“删除项目”旁边的框。
  4. 保存视图。
  5. 假设您知道如何使用Drush,请运行以下命令:(使用linux“屏幕”不间断地运行大型数据集)

drush vbo-执行my_view action :: views_bulk_operations_delete_item

其中,my_view是视图的计算机名称

您也可以使用drush vbo-list显示所有可用的视图及其批量操作。

现在,VBO应该在外壳中运行,从而为您提供反馈。


2

那里有一个“ 全部删除”模块。它将删除站点中的所有节点和/或用户。

它还具有Drush支持:

例子:

drush delete-all article             Delect all article nodes.  
drush delete-all all                 Delete nodes of all types.  
drush delete-all --reset             Delete nodes of all types, and reset node, revision and comment counters.  
drush delete-all users               Delete users.

7
我强烈建议您不要使用此模块-它在脚本上设置了30秒的时间限制,并逐个遍历每个节点进行调用node_delete()(它甚至不需要使用node_delete_multiple())。更令人担忧的是,它具有一个选项,可直接从数据库表中删除数据,而无需使用字段API,也无需使用挂钩。根本没有批处理作业,它一直运行到脚本死亡为止。非常危险的模块恕我直言。
克莱夫(Clive)

2
如果您知道自己在做什么并进行备份,可能仍然有用。调用所有的钩子和api时删除数千个节点可能会非常缓慢。:(
Letharion

@Letharion没有痛苦,没有收获;)您当然是对的,尽管我最好对此声明一句免责声明,因为如果使用不正确,此模块可能会使事情变得混乱!
克莱夫(Clive)

@Clive如果drush delete-all article需要删除文章,可以使用drush支持,我将寻求该解决方案。
AjitS

@develkar对于几百个节点来说可能很好,但是drush扩展使用的功能与现场版本完全相同,因此不幸的是,它仍然容易受到超时的影响
Clive


0

对于像您这样的情况,要删除大量(即批量)节点,您也可以使用批量删除模块

这将使用Batch API删除节点,以避免在一次调用node_delete_multiple()删除数千个节点时出现超时或内存问题。

除此之外,您甚至可以尝试删除所有模块以删除内容类型的所有节点。

希望这可以帮助。


0

您还可以使用BATCH API为它创建批处理,在该批处理中

foreach($nodes as $node){ node_delete($node[nid]);}

而已。您已经完成了。如果要为其创建drush命令,也可以创建它。供参考,请看这个


0

如果您有理由通过代码进行操作:

$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->propertyOrderBy('nid', 'DESC')
  ->range(1000, 1000);

$result = $query->execute();
node_delete_multiple(array_keys($result['node']));

您还具有许多其他可用方法来选择要删除的节点。


0

如果您确实处于紧要关头,可以采纳Bobik的建议并将其作为'drush php-eval'的参数,但是我希望它的性能与VBO相似,但速度稍快一些。如果性能确实很慢,您可能希望通过将代码库中的_node_delete()复制为g_,然后确定是否可以禁用某些正在使用该挂钩的模块来查看哪些模块正在调用hook_node_delete。

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.