Gelöschtes Feld aus Datenbank löschen

9

Ich habe Felder erstellt, die gelöscht wurden. Tabellen für die Felder sind beim Löschen nicht mehr vorhanden, befinden sich jedoch noch in field_configundfield_config_instance

Gibt es überhaupt eine Möglichkeit, sie zu reinigen?

Vielen Dank

lusketeer
quelle

Antworten:

10

Die Einträge in field_configund field_config_instancehaben wahrscheinlich einen Wert von 1in der deletedSpalte.

Dies bedeutet, dass sie zum Löschen markiert sind, aber erst gelöscht werden, wenn Sie cron ausführen (gelöschte Felddaten werden gelöscht field_cron()).

Clive
quelle
du bist der Mann. Ich hatte phpmyadmin nicht installiert, also habe ich keine anderen Spalten für diese beiden Tabellen über die SSH-Verbindung überprüft. danke Clive
lusketeer
11

mit drush:

$ drush eval "field_purge_batch(500)"

Möglicherweise müssen Sie einige Male ausführen oder $ batch_size erhöhen, dann gibt es möglicherweise auch nach dem Ausführen von cron noch die Tabellen field_deleted und field_deleted_revision

Abfrage

SELECT * FROM `field_config` WHERE `deleted` = 1
SELECT * FROM `field_config_instance` WHERE `deleted` = 1

Wenn Sie leer sind, können Sie diese verbleibenden Tabellen sicher löschen

decibel.places
quelle
Dies ist eine großartige Antwort, danke @ decibel.places!
Joelpittet
6

Alternativ zum Ausführen von cron zum Entfernen gelöschter Daten können Sie field_purge_batch ($ batch_size) manuell ausführen .

Um die Funktion manuell auszuführen, können Sie entweder:

  • Bootstrap Drupal in einer PHP-Datei
  • Erstellen Sie einen Menü-Hook-Page-Rückruf
  • Wenn Sie das Entwicklungsmodul installiert haben, besuchen Sie / devel / php

Die zu verwendende $ batch_size hängt von Ihrer Serverumgebung und Ihren Anforderungen ab. Ich habe Werte so niedrig wie 5 und so hoch wie 10000 verwendet.

Cody Craven
quelle
4

Für diese Drupal 8-Benutzer

Ich habe das auch erlebt, grabe den Code aus. Ich fand dies alles Grund, warum Felder nicht gelöscht wurden, nachdem Sie dies getan haben:

  • Cron Gazillion mal ausführen
  • Führen Sie drush eval "field_purge_batch (500)" millionenfach aus

Die Felder bleiben bestehen und verschwinden nicht. Dies liegt an einer Logik hier in 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;
  }

Die abhängigen Module werden deinstalliert. Aus diesem Grund werden die Felder nicht entfernt.

Wie kann man das lösen? Es wird empfohlen, das Modul zuerst neu zu installieren, diese Felder zu löschen und wieder zu deinstallieren. So finden Sie heraus, welches Modul Sie neu installieren müssen:

$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"

Falls Sie diesen Ansatz der Neuinstallation des Moduls nicht verwenden möchten, können Sie ihn auch sofort löschen. Ich bin mir nicht sicher, wie es sich verhält, aber es sollte den Job erledigen.

Backup zuerst !!!

Ja, sei nicht faul, es wird deinen Arsch retten, wenn etwas schief geht.

$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);
  }
}

Mach das Cron zum letzten Mal. Ich hoffe es wird das Problem beheben :)

kororo
quelle
Willkommen bei Drupal Answers! Bitte kopieren Sie nicht dieselbe Antwort für mehrere Fragen. Wenn es sich um Duplikate handelt, kennzeichnen Sie sie als Duplikate.
Kiamlaluno
0

Kann keine Lösung finden. Also habe ich sie manuell aus diesen beiden Tabellen gelöscht.

lusketeer
quelle
Das ist mir auch gerade passiert: Felder in der Produktion erstellt, in das Testsystem kopiert. Die Felder in der Produktion wurden zurückgesetzt und erneut in das Testsystem kopiert. Cron wurde wahrscheinlich in der Zwischenzeit ausgeführt. Da die Testdatenbank nicht ordnungsgemäß gelöscht / neu erstellt wurde, wurden die beiden verbleibenden Tabellen für Daten und Revisionen beibehalten ... Ergebnisse: * Führen Sie cron immer aus, bevor Sie eine Sicherung durchführen *, wenn Sie in eine Testdatenbank importieren , immer fallen lassen & erschaffen
Beat Christen
drupal.org/node/1351506 Dies ist immer noch ein bekanntes Problem.
Kevin Morse