Löschen Sie 13000 Knoten


9

Ich habe ungefähr 13000 Knoten, die auf einer Drupal 7-Site gelöscht werden müssen. Ich habe versucht, mit dem Modul " Views Bulk Operations" 500 Knoten gleichzeitig zu löschen, aber es tritt eine Zeitüberschreitung auf. Ich kann nur 50 Knoten gleichzeitig löschen.

Wie kann ich mehr als 50 Knoten gleichzeitig löschen?


Früher gab es ein "Bulk-Delete" -Modul, das jedoch zugunsten von VBO veraltet war. VBO scheint jedoch die Stapelverarbeitung zu unterstützen. Haben Sie versucht, es zu verwenden?
Mołot

1
VBO, wie in den Antworten unten angegeben, ist wahrscheinlich der richtige Weg. Was ich in Zeiten getan habe, in denen ich eine Größenordnung mehr Knoten als in diesem Fall löschen musste, ist das Aufrufen des Hack-Moduls, um viele Hook-Aufrufe zu ignorieren, die ich nicht benötige. (Mein schlimmster Täter war Apache Solr). Dies kann die Arbeit erheblich beschleunigen, muss aber natürlich mit großer Sorgfalt durchgeführt werden.
Letharion

Antworten:


16

VBO ist der De-facto-Standard für das Löschen von Massenknoten. Es gibt einfach keinen besseren Weg, dies zu tun.

Da VBO stapelweise verarbeitet, werden jeweils nur 1 (oder möglicherweise einige) Knoten gleichzeitig ausgeführt. Wenn Sie also Timeout-Fehler erhalten, beziehen sich diese auf das Löschen eines einzelnen Knotens und nicht auf den gesamten Stapelvorgang.

Die Standardauflösung für so etwas besteht darin , die maximale Ausführungszeit von PHP zu erhöhen , um dies zu kompensieren.


2
Nur um die Antwort zu vervollständigen: Sie können auswählen, wie viele Entitäten für die Operation abgeholt werden sollen. Die Verwendung von 100 reicht meiner Erfahrung nach in ~ 1 Minute aus.
AyeshK

6

Installieren Sie Devel. Gehen Sie dann in D7 zu admin / config / development / generate / content und wählen Sie alle Inhaltstypen aus. Aktivieren Sie "Alle Inhalte löschen". Geben Sie 0 in "Wie viele Knoten möchten Sie generieren?"

Klicken Sie auf Generieren.

Dadurch werden alle Knoten gelöscht.


1
@ Mołot ' Check "Alle Inhalte löschen " ' ... 'Geben Sie 0 in "Wie viele Knoten möchten Sie generieren?"' ...;)
Clive

@Clive OK, mein Fehler, sorry.
Mołot

1
Insbesondere ist es das Devel Generate-Modul, das dies tut. Es wird mit Devel geliefert, aber Sie erhalten diese Funktionalität nicht, wenn Sie nur Devel aktivieren. Auf diese Weise können Sie auch problemlos alle Knoten eines bestimmten Inhaltstyps löschen , wenn Sie nicht alles löschen möchten. Wenn Sie immer noch PHP-Zeitüberschreitungen haben und keine Angst vor der CLI haben, können Sie auch den Befehl Drush generate-content( genc) verwenden, der mit Devel Generate geliefert wird. drush help gencfür Nutzungsinformationen.
Garrett Albright

3

Verwenden Sie ein VBO und führen Sie es von Drush aus. Ich habe die folgende Methode verwendet, um nach dem Skalentest über 1,5 Millionen Knoten zu löschen.

  1. Erstellen Sie eine neue Ansicht mit einer Seite. Stellen Sie die Filter so ein, dass nur der Knotentyp angezeigt wird, den Sie löschen möchten.
  2. Fügen Sie ein neues Feld hinzu: "Massenoperationen: Inhalt"
  3. Aktivieren Sie das Kontrollkästchen neben "Element löschen" unter "Ausgewählte Massenvorgänge".
  4. Speichern Sie die Ansicht.
  5. Angenommen, Sie wissen, wie man Drush verwendet, führen Sie den folgenden Befehl aus: (Verwenden Sie einen Linux-Bildschirm, um ununterbrochen für große Datenmengen ausgeführt zu werden.)

drush vbo- execute my_view action :: views_bulk_operations_delete_item

Wobei my_view der Computername Ihrer Ansicht ist

Sie können auch drush vbo-list verwenden , um alle verfügbaren Ansichten und ihre Massenoperationen anzuzeigen .

Der VBO sollte jetzt in der Shell ausgeführt werden und Ihnen dabei Feedback geben.


2

Es gibt da draußen ein Modul zum Löschen aller . Es werden alle Knoten und / oder Benutzer von der Site gelöscht.

Es hat auch Drush-Unterstützung:

Beispiele:

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
Ich würde dringend empfehlen, dieses Modul nicht zu verwenden - es legt ein Zeitlimit von 30 Sekunden für das Skript fest und durchläuft jeden einzelnen Knoten einzeln und ruft auf node_delete()(es macht sich nicht einmal die Mühe, es zu verwenden node_delete_multiple()). Noch besorgniserregender ist, dass es eine Option gibt, mit der Daten direkt aus den Datenbanktabellen gelöscht werden können, ohne die Feld-API zu verwenden und ohne Hooks. Überhaupt keine Batch-Jobs, es wird nur ausgeführt, bis das Skript stirbt. Sehr gefährliches Modul IMHO.
Clive

2
Könnte immer noch nützlich sein, wenn Sie wissen, was Sie tun, und Backups erstellen. Das Löschen von Tausenden von Knoten beim Aufrufen aller Hooks und Apis kann schmerzhaft langsam sein. :(
Letharion

@Letharion Kein Schmerz, kein Gewinn;) Du hast natürlich Recht, ich denke, ich würde einfach einen Haftungsausschluss darauf setzen, da dieses Modul die Dinge chaotisch machen könnte, wenn es in den falschen Händen ist!
Clive

@Clive Mit Drush-Unterstützung würde ich mich drush delete-all articlefür diese Lösung entscheiden, wenn ich Artikel löschen möchte.
AjitS

@develkar Für ein paar hundert Knoten mag das in Ordnung sein, aber die Drush-Erweiterung verwendet genau die gleichen Funktionen wie die Vor-Ort-Version, so dass sie leider immer noch genauso anfällig für Zeitüberschreitungen ist
Clive


0

Zum Löschen von Knoten in großer Anzahl (dh in großen Mengen) wie in Ihrem Fall können Sie hierfür auch das Massenlöschmodul verwenden .

Dadurch wird die Stapel-API zum Löschen der Knoten verwendet, um Zeitüberschreitungen oder Speicherprobleme beim Löschen von Tausenden von Knoten mit einem einzigen Aufruf von node_delete_multiple () zu vermeiden.

Abgesehen davon können Sie sogar versuchen, alle Module zu löschen, um alle Knoten eines Inhaltstyps zu löschen.

Hoffe das hilft.


0

Sie können auch einen Stapelprozess dafür mit der BATCH-API erstellen und dies in diesem Stapelprozess einfach tun

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

Das ist es. Sie sind hier fertig. Wenn Sie einen Drush-Befehl dafür erstellen möchten, können Sie ihn auch erstellen. Als Referenz sehen Sie sich dies bitte an .


0

Wenn Sie Grund haben, dies per Code zu tun:

$query = new EntityFieldQuery();

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

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

Sie haben auch viele andere verfügbare Methoden , um zu löschende Knoten auszuwählen.


0

Sie können Bobiks Rat befolgen und dies als Argument für eine "drush php-eval" verwenden, wenn Sie wirklich in Not sind, aber ich würde erwarten, dass die Leistung der von VBO ähnlich sein wird, während sie etwas schneller ist. Wenn die Leistung sehr langsam ist, können Sie sich ansehen, welche Module hook_node_delete aufrufen, indem Sie die Codebasis nach '_node_delete (' durchsuchen und dann bestimmen, ob Sie einige der Module deaktivieren können, die diesen Hook verwenden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.