Nettoyer le champ supprimé de la base de données

9

J'ai créé des champs supprimés. Les tableaux pour les champs ont disparu lors de la suppression, mais ils sont toujours dans field_configetfield_config_instance

Est-il possible de les nettoyer?

Merci

lusketeer
la source

Réponses:

10

Les entrées dans field_configet field_config_instanceauront probablement eu une valeur de 1dans la deletedcolonne.

Cela signifie qu'ils sont marqués pour suppression, mais ne seront pas réellement supprimés jusqu'à ce que vous exécutiez cron (les données de champ supprimées sont purgées field_cron()).

Clive
la source
tu es l'homme. Je n'ai pas installé phpmyadmin, donc je n'ai pas vérifié les autres colonnes pour ces deux tables via la connexion ssh. merci Clive
lusketeer
11

en utilisant drush:

$ drush eval "field_purge_batch(500)"

vous devrez peut-être exécuter plusieurs fois, ou augmenter la taille de $ batch_s alors il pourrait toujours y avoir des tables field_deleted et field_deleted_revision, même après avoir exécuté cron

requete

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

si vous venez vide, vous pouvez supprimer en toute sécurité ces tables restantes

decibel.places
la source
Ceci est une excellente réponse, merci @ decibel.places!
joelpittet
6

Au lieu d'exécuter cron pour supprimer les données supprimées, vous pouvez exécuter manuellement field_purge_batch ($ batch_size) .

Pour exécuter manuellement la fonction, vous pouvez soit:

  • Bootstrap Drupal dans un fichier php
  • Créer un rappel de page de hook de menu
  • Si vous avez installé le module devel, visitez / devel / php

La taille de lot à utiliser varie en fonction de l'environnement et des besoins de votre serveur. J'ai utilisé des valeurs aussi basses que 5 et aussi élevées que 10000.

Cody Craven
la source
4

Pour les utilisateurs de Drupal 8,

J'ai aussi vécu ça, fouillez le code. J'ai trouvé cela pour toutes les raisons pour lesquelles les champs n'étaient pas supprimés après vous, les éléments suivants:

  • exécution de fois gazon cron
  • exécutez la validation drush "field_purge_batch (500)" millions de fois

Les champs persistent à ne pas disparaître, ceci en raison d'une logique ici, dans 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;
  }

Les modules qui sont dépendants sont désinstallés. c'est la raison pour laquelle les champs ne sont pas supprimés.

Comment résoudre ça? Il est recommandé de réinstaller le module en premier et de purger ces champs et de le désinstaller à nouveau. Pour savoir quel module vous devez réinstaller:

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

Dans le cas où vous ne souhaitez pas adopter cette approche de réinstallation du module, vous pouvez également supprimer immédiatement, je ne sais pas quel est le comportement mais il devrait faire le travail.

Sauvegarde d'abord !!!

Oui, ne soyez pas paresseux, cela vous sauvera le cul, si quelque chose se passe mal.

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

Faites le cron pour la dernière fois. J'espère que cela résoudra le problème :)

kororo
la source
Bienvenue dans Drupal Answers! Veuillez ne pas copier-coller la même réponse pour plusieurs questions. S'il s'agit de doublons, signalez-les comme doublons.
kiamlaluno
0

Je n'arrive pas à trouver de solution. J'ai donc fini par les supprimer manuellement de ces deux tables.

lusketeer
la source
Cela m'est arrivé aussi: j'ai créé des champs en production, je les ai copiés dans le système de test. Rétablit les champs en production, copiés à nouveau dans le système de test. Cron a probablement fonctionné entre-temps, donc puisque la base de données de test n'a pas été correctement supprimée / recréée, les deux tables restantes pour les données et les révisions ont été conservées ... Constatations: * toujours exécuter cron AVANT d'effectuer une sauvegarde * lors de l'importation dans une base de données de test , toujours déposer et créer
Beat Christen
drupal.org/node/1351506 c'est toujours un problème connu.
Kevin Morse