Pulisci campo eliminato dal database


9

Ho creato i campi cancellati. Le tabelle per i campi sono state cancellate, ma sono ancora in field_configefield_config_instance

C'è un modo per pulirli?

Grazie

Risposte:


10

Le voci in field_confige field_config_instanceprobabilmente avranno avuto un valore 1nella deletedcolonna.

Ciò significa che sono contrassegnati per l'eliminazione, ma non verranno effettivamente eliminati finché non si esegue cron (i dati dei campi eliminati vengono eliminati field_cron()).


tu sei l'uomo. Non ho installato phpmyadmin, quindi non ho controllato altre colonne per quelle due tabelle attraverso la connessione SSH. grazie Clive
lusketeer il

11

usando drush:

$ drush eval "field_purge_batch(500)"

potresti dover eseguire alcune volte o aumentare $ batch_size quindi potrebbero esserci ancora tabelle field_deleted e field_deleted_revision, anche dopo aver eseguito cron

domanda

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

se vieni vuoto, puoi tranquillamente eliminare quelle tabelle rimanenti


Questa è un'ottima risposta, grazie @ decibel.places!
joelpittet,

6

In alternativa all'esecuzione di cron per rimuovere i dati eliminati, è possibile eseguire manualmente field_purge_batch ($ batch_size) .

Per eseguire manualmente la funzione è possibile:

  • Bootstrap Drupal in un file php
  • Creare una richiamata della pagina hook del menu
  • Se il modulo di sviluppo è installato, visitare / devel / php

$ Batch_size da utilizzare varia in base all'ambiente e alle esigenze del server. Ho usato valori bassi come 5 e fino a 10000.


4

Per quegli utenti di Drupal 8,

Ho sperimentato anche questo, scavare il codice. Ho trovato questo motivo per cui i campi non sono stati eliminati dopo averlo fatto, quanto segue:

  • eseguendo cron gazillion volte
  • eseguire drush eval "field_purge_batch (500)" milioni di volte

I campi persistono non andando via, questo a causa di un pezzo di logica qui, 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;
  }

I moduli dipendenti sono disinstallati. questo è il motivo per cui i campi non vengono rimossi.

Come risolverlo? Si consiglia di reinstallare prima il modulo, eliminare i campi e disinstallarli nuovamente. Per scoprire quale modulo è necessario reinstallare:

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

Nel caso in cui non si desideri seguire questo approccio di reinstallazione del modulo, è anche possibile eliminare immediatamente, non sono sicuro di quale sia il comportamento, ma dovrebbe fare il lavoro.

Prima il backup !!!

Sì, non essere pigro, ti salverà il culo, se qualcosa va storto.

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

Esegui il cron per l'ultima volta. Spero che risolverà il problema :)


Benvenuto in Drupal Answers! Si prega di non copiare e incollare la stessa risposta per più domande. Se sono duplicati, contrassegnali come duplicati.
kiamlaluno

0

Non riesco a trovare alcuna soluzione. Così ho finito per cancellarli manualmente da quelle due tabelle.


Questo è successo anche a me: creato campi in produzione, copiato nel sistema di test. Ripristinato i campi in produzione, copiato nuovamente nel sistema di test. Probabilmente Cron è stato eseguito nel frattempo, quindi poiché il database di test non è stato correttamente rimosso / ricreato, le due tabelle rimanenti per i dati e le revisioni sono state mantenute ... Risultati: * esegui sempre cron PRIMA di eseguire un backup * quando si importa in un database di test , rilascia e crea sempre
batti Christen

drupal.org/node/1351506 questo è ancora un problema noto.
Kevin Morse,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.