Очистити видалене поле з бази даних


9

Я створив поля, видалив їх. Таблиці для полів видаляються, але вони все ще знаходяться в field_configтаfield_config_instance

Чи є все-таки їх очищення?

Дякую

Відповіді:


10

Записи в field_configі field_config_instance, ймовірно, мали б значення 1у deletedстовпці.

Це означає, що вони позначені для видалення, але насправді їх не буде видалено, доки ви не запустите cron (дані видалених полів не введені field_cron()).


ти чоловік. У мене не було встановлено phpmyadmin, тому я не перевіряв інші стовпці для цих двох таблиць через ssh-з'єднання. дякую
Клайву

11

за допомогою барабану:

$ drush eval "field_purge_batch(500)"

вам, можливо, доведеться запустити кілька разів або збільшити розмір $ batch_size, то, можливо, все ще існують таблиці field_deleted і field_deleted_revision, навіть після запуску cron

запит

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

якщо ви з'явилися порожніми, можете безпечно видалити ці залишені таблиці


Це чудова відповідь, дякую @ decibel.places!
joelpittet

6

Як альтернатива запуску cron для видалення видалених даних, ви можете вручну запустити field_purge_batch ($ batch_size) .

Щоб вручну запустити функцію, ви можете:

  • Bootstrap Drupal у файлі php
  • Створіть зворотний дзвінок на сторінці гачка меню
  • Якщо у вас встановлений модуль devel, відвідайте / devel / php

Використовуваний $ batch_size буде змінюватися в залежності від середовища та потреб вашого сервера. Я використовував значення від 5 до 10000.


4

Для цих користувачів Drupal 8,

Я це також пережив, викопайте код. Я знайшов, що це все, чому поля, які ви не видаляли після вас,:

  • виконуючи крон газильйон разів
  • запустити drush eval "field_purge_batch (500)" мільйонів разів

Поля зберігається, щоб вони не відходили, це пояснюється частиною логіки тут, у 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;
  }

Модулі, які є залежними, видаляються. саме тому поля не видаляються.

Як це вирішити? Рекомендується підходити до перевстановлення модуля спочатку та очищення цих полів та видалення назад. Щоб дізнатися, який модуль потрібно перевстановити:

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

У випадку, якщо ви не хочете перейти на такий підхід перевстановити модуль, ви можете також відразу ж видалити, я не впевнений, що таке поведінка, але він повинен зробити роботу.

Резервне копіювання перше !!!

Так, не лінуйся, це врятує твою дупу, якщо щось піде не так.

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

Робіть крон востаннє. Сподіваюся, це вирішить проблему :)


Ласкаво просимо до відповідей Drupal! Будь ласка, не копіюйте та вставляйте однакову відповідь на декілька питань. Якщо вони є дублікатами, позначте їх як дублікати.
kiamlaluno

-1

Не можу знайти рішення. Тому я видалив їх із цих двох таблиць вручну.


Це теж трапилося і зі мною: створив поля у виробництві, скопіював його в тестову систему. Повернув поля у виробництві, знову скопіював у тестову систему. Cron, ймовірно, тим часом працював, тому, оскільки тестова база даних не була належним чином відкинута / відтворена, дві таблиці, що залишилися, для даних та ревізій, що зберігаються навколо ... Висновки: * завжди запускайте cron ДО ВІДПОВІДІ резервного копіювання * при імпорті до тестової бази даних , завжди кидайте та створюйте
Beat Christen

drupal.org/node/1351506 це все ще відома проблема.
Кевін Морзе

-1

Якщо ви кілька разів запустите drupal cron, drupal видалить таблиці полів та його вміст. Ви можете легко виконати наступні кроки для запуску декількох кронів, але ці кроки можуть заблокувати вашу систему, веб-сайти чи хостинг, але ви можете це зробити, якщо керуєте своєю системою.

  1. Перейдіть на сторінку статусу Drupal (адміністратор / звіти / статус).
  2. Внизу на сторінці ви можете побачити щось на кшталт "запустити cron вручну" та посилання на кшталт "run cron from external" та посилання з параметром cron_key. Скопіюйте це посилання.
  3. Перейдіть до терміналу (Linux або mac термінал).
  4. Напишіть наступну команду bash:

    поки правда; зробіть curl [помістіть сюди скопійоване посилання, видаливши дужки]; зроблено;

  5. Натисніть Enter. Команда буде виконуватися необмежену кількість разів.

  6. Ви можете зайти в свою базу даних, як-от phpmyadmin, і шукати «видалити» названі таблиці. Ви можете бачити, як рядки видаляються та йдуть вниз. Коли всі таблиці з "видалити" в імені будуть порожніми, вони будуть випадені. Якщо ви не бачите жодних видалених таблиць у базі даних, ви можете перейти до заключного 7 кроку.
  7. Зупинив команду bash в терміналі. Ви можете натиснути клавіші ctrl + c. Якщо ви не можете, закрийте термінал.

Як я вже коментував, це не найкраще рішення, але це просто, воно працює, ви нічого поганого не зробите, тому що ви запускаєте лише drupal cron, тож ви можете зламати що завгодно з неправильним PHP-кодом. В іншому випадку ви можете наситити сервер, систему, хостинг чи будь-що інше у вашій мережі, тому що ці кроки виконуються багато разів за крон, і це змушує споживання веб-ресурсів, але якщо у вас є контроль над ресурсами, їх не дуже багато таблиці чи рядки для чищення, або ви знаєте, що це безпечно зробити для вас, ви можете це зробити.

І я знаю, це не найкраще рішення. Але це працює. Можливо, це просте і найкраще рішення для вашої ситуації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.