Odpowiedzi:
Wpisy w field_config
i field_config_instance
prawdopodobnie będą miały wartość 1
w deleted
kolumnie.
Oznacza to, że są oznaczone do usunięcia, ale w rzeczywistości nie zostaną usunięte, dopóki nie uruchomisz crona (usunięte dane pola zostaną usunięte field_cron()
).
za pomocą drush:
$ drush eval "field_purge_batch(500)"
być może będziesz musiał uruchomić kilka razy lub zwiększyć $ batch_size, wtedy nadal mogą istnieć tabele field_deleted i field_deleted_revision, nawet po uruchomieniu crona
pytanie
SELECT * FROM `field_config` WHERE `deleted` = 1
SELECT * FROM `field_config_instance` WHERE `deleted` = 1
jeśli wyjdziesz pusty, możesz bezpiecznie usunąć te resztki tabel
Alternatywnie do uruchamiania crona w celu usunięcia usuniętych danych, możesz ręcznie uruchomić field_purge_batch ($ batch_size) .
Aby ręcznie uruchomić funkcję, możesz:
Wartość $ batch_size będzie się różnić w zależności od środowiska serwera i potrzeb. Użyłem wartości tak niskiej jak 5 i tak wysokiej jak 10000.
Dla tych użytkowników Drupal 8
Doświadczyłem tego również, wykop kod. Znalazłem to wszystko, dlaczego pola nie zostały usunięte po tobie:
Pola nadal nie znikają, co wynika z logiki w polu 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;
}
Moduły zależne są odinstalowane. to jest powód, dla którego pola nie są usuwane.
Jak to rozwiązać? Zaleca się najpierw przeinstalowanie modułu, wyczyszczenie tych pól i odinstalowanie z powrotem. Aby dowiedzieć się, który moduł należy zainstalować ponownie:
$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"
W przypadku, gdy nie chcesz zastosować tego podejścia do ponownej instalacji modułu, możesz również od razu usunąć, nie jestem pewien, jakie jest zachowanie, ale powinno to zrobić.
Najpierw wykonaj kopię zapasową !!!
Tak, nie bądź leniwy, uratuje ci tyłek, jeśli coś pójdzie nie tak.
$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);
}
}
Zrób crona po raz ostatni. Mam nadzieję, że to rozwiąże problem :)
Nie mogę znaleźć żadnego rozwiązania. Tak więc skończyłem ręcznie usuwając je z tych dwóch tabel.
Jeśli uruchomisz kilkakrotnie cron drupal, drupal usunie tabele pól i ich zawartość. Możesz wykonać kolejne kroki, aby z łatwością uruchomić kilka razy crona, ale te kroki mogą zablokować system, stronę internetową lub hosting, ale możesz to zrobić, jeśli kontrolujesz system.
Napisz następną komendę bash:
chociaż prawda; do curl [wstaw skopiowany link, usuwając nawiasy]; gotowy;
Naciśnij enter. Polecenie zostanie wykonane nieograniczoną liczbę razy.
Jak już wcześniej powiedziałem, nie jest to najlepsze rozwiązanie, ale jest proste, działa, nie zrobisz nic złego, ponieważ używasz tylko cronu Drupal, więc możesz zepsuć wszystko za pomocą niewłaściwego kodu php. W przeciwnym razie możesz nasycić serwer, system, hosting lub cokolwiek innego w swojej sieci, ponieważ te kroki są uruchamiane wiele razy przez crona i powoduje to zużycie zasobów internetowych, ale jeśli masz kontrolę nad zasobami, nie ma zbyt wiele tabele lub wiersze do czyszczenia lub wiesz, że możesz to zrobić bezpiecznie dla swojego systemu, możesz to zrobić.
I wiem, że to nie jest najlepsze rozwiązanie. Ale to działa. Być może jest to łatwe i najlepsze rozwiązanie dla Twojej sytuacji.