Wyczyść usunięte pole z bazy danych

9

Utworzyłem pola je usunąłem. Tabele dla pól znikają po usunięciu, ale nadal są w field_configifield_config_instance

Czy w ogóle można je wyczyścić?

Dzięki

lusketeer
źródło

Odpowiedzi:

10

Wpisy w field_configi field_config_instanceprawdopodobnie będą miały wartość 1w deletedkolumnie.

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()).

Clive
źródło
jesteś meżczyzną. Nie miałem zainstalowanego phpmyadmin, więc nie sprawdziłem innych kolumn dla tych dwóch tabel przez połączenie ssh. dzięki Clive
lusketeer
11

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

decibel.places
źródło
To świetna odpowiedź, dzięki @ decibel.places!
joelpittet
6

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:

  • Bootstrap Drupal w pliku php
  • Utwórz wywołanie zwrotne strony haka menu
  • Jeśli masz zainstalowany moduł devel, odwiedź stronę / devel / php

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.

Cody Craven
źródło
4

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:

  • przeprowadzanie czasów Cron Gazillion
  • uruchom drush eval „field_purge_batch (500)” milion razy

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 :)

kororo
źródło
Witamy w Drupal Answers! Nie kopiuj-wklej tej samej odpowiedzi na wiele pytań. Jeśli są duplikatami, oflaguj je jako duplikaty.
kiamlaluno
-1

Nie mogę znaleźć żadnego rozwiązania. Tak więc skończyłem ręcznie usuwając je z tych dwóch tabel.

lusketeer
źródło
To samo mi się przydarzyło: stworzyłem pola produkcyjne, skopiowałem je do systemu testowego. Cofnięto pola produkcji, ponownie skopiowano do systemu testowego. Cron prawdopodobnie działał w międzyczasie, dlatego ponieważ testowa baza danych nie została poprawnie usunięta / ponownie utworzona, dwie pozostałe tabele danych i poprawek zostały zachowane w pobliżu ... Wyniki: * zawsze uruchamiaj crona PRZED zrobieniem kopii zapasowej * podczas importowania do testowej bazy danych , zawsze upuszczaj i twórz
Beat Christen
drupal.org/node/1351506 to wciąż znany problem.
Kevin Morse
-1

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.

  1. Przejdź do strony statusu Drupal (administrator / raporty / status).
  2. Na dole strony możesz zobaczyć coś takiego jak „uruchom cron ręcznie” i link jak „uruchom cron z zewnątrz” oraz link z parametrem cron_key. Skopiuj ten link.
  3. Przejdź do terminala (Linux lub Mac).
  4. Napisz następną komendę bash:

    chociaż prawda; do curl [wstaw skopiowany link, usuwając nawiasy]; gotowy;

  5. Naciśnij enter. Polecenie zostanie wykonane nieograniczoną liczbę razy.

  6. Możesz przejść do bazy danych, na przykład phpmyadmin, i poszukać „usuń” nazwanych tabel. Możesz zobaczyć, jak wiersze są usuwane i zejść. Gdy wszystkie tabele zawierające w nazwie słowo „usuń” zostaną opróżnione, zostanie ono usunięte. Jeśli nie widzisz żadnych usuniętych tabel w bazie danych, możesz przejść do ostatniego 7 kroku.
  7. Zatrzymano polecenie bash w terminalu. Możesz nacisnąć klawisze Ctrl + C. Jeśli nie możesz, zamknij terminal.

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.

Victor Anonops
źródło