So löschen Sie Knotenrevisionen


7

Ich muss vor dem Upgrade auf Drupal 7 alle Knotenrevisionen löschen, um Zeit bei der Migration zu sparen. Gibt es eine Möglichkeit, das zu tun?


Ich entschuldige mich: Meine erste Antwort war unvollständig. Sie sollten anderen Modulen mitteilen, dass Sie Knotenrevisionen löschen. Andernfalls verbleiben Revisionsdaten in Datenbanktabellen, die von Modulen von Drittanbietern verarbeitet werden. Während der Migration ist es möglich, dass die Module von Drittanbietern veraltete Informationen entfernen, aber ich bezweifle, dass sie die vorhandenen Revisionen überprüfen würden, um nicht erforderliche Daten zu entfernen. In einer Drupal-Site mit vielen Knoten würde dies viel Zeit in Anspruch nehmen.
Kiamlaluno

Antworten:


12

Sie können den folgenden Code verwenden.

db_query('DELETE FROM {node_revisions} nr WHERE nr.vid NOT IN (SELECT n.vid FROM {node} n)');

Sie möchten nicht alle Revisionen löschen: Sie möchten alle außer der aktuellen Revision löschen.

Wenn Sie nur diese Abfrage ausführen, bleiben Daten zu gelöschten Revisionen in anderen Datenbanktabellen erhalten, da Module, die Informationen zu einer Revision speichern, nicht benachrichtigt werden, dass eine Revision gelöscht wird. Ich denke zum Beispiel an das CCK-Modul, das Informationen über die Knotenfelder in eigenen Datenbanktabellen speichert. Das CCK-Modul führt den folgenden Code aus, wenn eine Revision gelöscht wird.

/**
 * Implementation of hook_nodeapi 'delete_revision' op.
 *
 * Delete node type fields for a revision.
 */
function content_delete_revision(&$node) {
  _content_field_invoke('delete revision', $node);
  _content_field_invoke_default('delete revision', $node);
  cache_clear_all('content:'. $node->nid .':'. $node->vid, content_cache_tablename());
}

Ein vollständigerer Code ähnelt dem folgenden.

$query = db_query('SELECT nr.nid, nr.vid FROM {node_revisions} nr WHERE nr.vid NOT IN (SELECT n.vid FROM {node} n)');

while ($revision = db_fetch_object($query)) {
  if ($node = node_load($revision->nid, $revision->vid)) {
    node_invoke_nodeapi($node, 'delete revision');
  }
}

db_query('DELETE FROM {node_revisions} nr WHERE nr.vid NOT IN (SELECT n.vid FROM {node} n)');

Wenn ich mir den Code von node_revision_delete_confirm_submit () ansehe , sehe ich nichts anderes, was getan werden muss.

Die Ausführung des neuen Codes, den ich geschrieben habe, kann je nach Anzahl der Knoten und Überarbeitungen viel Zeit in Anspruch nehmen. Dies bedeutet, dass der Code ausgeführt werden sollte:

  1. In einer Implementierung von hook_cron ()
  2. Als Batch-Operation
  3. In einer PHP-Datei, die Drupal bootet und die Ausführungszeit mit erhöht @set_time_limit(240)
  4. Mit Drush

Da der Code nur für die Migration erforderlich ist, würde ich die ersten beiden Optionen vermeiden, bei denen Sie ein Modul schreiben müssten, das Sie gerade in diesem speziellen Fall benötigen. Wenn Sie mehr Sites haben und alle denselben Code ausführen müssen, ist Option 3 immer möglich, und das wird von Drupal mit cron.php aus getan .
Bei Option 4 würde ich zunächst überprüfen, ob Drush noch keine Befehle hat, die in diesem Fall hilfreich sein könnten. Ich würde das Rad nicht neu erfinden, wenn es nicht unbedingt notwendig ist. Ich würde auch überprüfen, wie man Drush Shell-Skripte schreibt .


Danke Kiamlaluno ... ja, ich möchte die aktuelle Version behalten.
user8012

1
Weiß jemand, ob dies verhindert, dass die Überarbeitungen der Feldwerte ebenfalls übertragen werden? Ich vermute es würde, aber nur neugierig.
Johnathan Elmore

@ JohnathanElmore Ich habe meine Antwort aktualisiert.
Kiamlaluno

:) das ist großartig. Ich denke, das würde den Server stark belasten, aber einige ini_set ('memory_limit', '128M'); und / oder ini_set ('max_execution_time', 1000); würde diese Art von Problemen mildern.
Johnathan Elmore

3
Die richtige Unterabfrage ist (SELECT n.vid FROM {node} n). Andernfalls wird ein SQL-Fehler bezüglich eines falschen Spaltennamens angezeigt.
mpdonadio

1

Wir hatten eine Website mit> 500.000 alten Revisionen in ihrer Datenbank. Es gibt ein nettes Modul zum Ausschalten einer kleinen Anzahl von Revisionen namens http://drupal.org/project/revision_deletion . Um jedoch schnell einen großen Satz zu entfernen, haben wir dieses Skript geschrieben.

Die allgemeine Idee besteht darin, alle Revisionen zu entfernen, die älter als ein bestimmtes Datum sind, und dann für jede CCK-Tabelle dasselbe zu tun. Unabhängig davon, welches Datumslimit Sie auswählen, wird die aktuelle Revision nicht gelöscht.

WARNUNG: Es werden Annahmen zu Ihren Namenskonventionen für Tabellen getroffen - nur für eine Sicherung verwenden

<?php
// Note - this is for Drupal 6.x
function remove_revisions() {

  // Set limit for revision age
  $days_ago = 30;

  // delete all revisions from node_revisions
  $limit = time() - (60*60*24*$days_ago);
  $sql = "DELETE FROM node_revisions WHERE timestamp < $limit AND vid NOT IN (SELECT vid FROM node)";
  db_query($sql);

  $rows = db_affected_rows();
  drupal_set_message("$rows revisions deleted -- node_revisions");

  $table_types = array('content_field_%%', 'content_type_%%');

  // remove orphaned data from CCK content tables
  foreach($table_types as $table_type) {
    $result= db_query("SHOW TABLES LIKE '$table_type'");
    while ($row = db_fetch_array($result)) {
      $table = current($row);
      $sql = "DELETE FROM $table WHERE vid NOT IN (SELECT vid FROM node_revisions)";
      db_query($sql);
      $rows = db_affected_rows();
      drupal_set_message("$rows revisions deleted -- $table");
    }
  }
}
?>

Quelle: http://fivepaths.com/drupal-revision-removal-and-database-cleanup-by-brute-force


0

in phpmyadmin

mach einfach :

DELETE FROM node_revisions WHERE node_revisions.vid NOT IN (SELECT node.vid FROM {node});

Ajay singh rathore. Bangalore


0

Dieser Code kümmert sich um Knotenrevisionen und alle CCK-Revisionen. Es kennt keine anderen möglichen Module, die Revisionen speichern, aber es ist schnell und Sie vermeiden es, an Cron, Batch, Ausführungszeitlimit oder Drush zu denken. Es gibt auch eine Tageslimiteinstellung, da in wie vielen Tagen ab heute Sie keine Revisionen entfernen möchten. Sie müssen den Code in ein Modul einfügen und ein hook_menu hinzufügen. Hat gut für mich funktioniert.

http://fivepaths.com/drupal-revision-removal-and-database-cleanup-by-brute-force

Bearbeiten 3. August 2015: Ups, die Seite ist weg. Ich kann das ausgraben, wenn jemand es will.

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.