Làm sạch trường đã xóa khỏi cơ sở dữ liệu


9

Tôi đã tạo các trường xóa chúng. Các bảng cho các trường đã hết khi xóa, nhưng chúng vẫn còn trong field_configfield_config_instance

Có cách nào để làm sạch chúng?

Cảm ơn

Câu trả lời:


10

Các mục trong field_configfield_config_instancecó thể sẽ có giá trị 1trong deletedcột.

Điều này có nghĩa là chúng được đánh dấu để xóa, nhưng thực tế sẽ không bị xóa cho đến khi bạn chạy cron (dữ liệu trường đã xóa được xóa field_cron()).


Bạn là người đàn ông. Tôi chưa cài đặt phpmyadmin, vì vậy tôi đã không kiểm tra các cột khác cho hai bảng đó thông qua kết nối ssh. cảm ơn Clive
lusketeer

11

sử dụng drush:

$ drush eval "field_purge_batch(500)"

bạn có thể phải chạy một vài lần hoặc tăng $ batch_size sau đó vẫn có thể có các bảng field_delatted và field_delatted_Vvision, ngay cả sau khi chạy cron

truy vấn

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

nếu bạn đến trống, bạn có thể xóa các bảng còn lại một cách an toàn


Đây là một câu trả lời tuyệt vời, cảm ơn @ decibel.places!
joelpittet

6

Thay thế cho việc chạy cron để xóa dữ liệu đã xóa, bạn có thể chạy thủ công field_purge_batch ($ batch_size) theo cách thủ công .

Để tự chạy chức năng, bạn có thể:

  • Bootstrap Drupal trong một tập tin php
  • Tạo một menu gọi lại trang hook
  • Nếu bạn đã cài đặt mô-đun devel, hãy truy cập / devel / php

$ Batch_size để sử dụng sẽ khác nhau tùy thuộc vào môi trường và nhu cầu máy chủ của bạn. Tôi đã sử dụng các giá trị thấp ở mức 5 và cao tới 10000.


4

Đối với những người dùng Drupal 8,

Tôi cũng có kinh nghiệm này, đào xuống mã. Tôi tìm thấy tất cả lý do tại sao các trường không bị xóa sau khi bạn đã làm như sau:

  • thực hiện cronillion lần
  • chạy drush eval "field_purge_batch (500)" triệu lần

Các trường vẫn không biến mất, điều này là do một phần logic ở đây, trong trường_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;
  }

Các mô-đun phụ thuộc, được gỡ cài đặt. đó là lý do tại sao các trường không được loại bỏ.

Làm thế nào để giải quyết điều này? Đó là cách tiếp cận được khuyến nghị để cài đặt lại mô-đun trước và lọc các trường đó và gỡ cài đặt lại. Để tìm ra mô-đun bạn cần cài đặt lại:

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

Trong trường hợp bạn không muốn thực hiện phương pháp cài đặt lại mô-đun đó, bạn cũng có thể xóa ngay lập tức, tôi không chắc hành vi đó là gì nhưng nó sẽ thực hiện công việc.

Sao lưu trước !!!

Vâng, đừng lười biếng, nó sẽ cứu lấy mông của bạn, nếu có sự cố xảy ra.

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

Làm cron lần cuối. Tôi hy vọng nó sẽ khắc phục vấn đề :)


Chào mừng đến với câu trả lời của Drupal! Vui lòng không sao chép-dán cùng một câu trả lời cho nhiều câu hỏi. Nếu chúng là bản sao, gắn cờ chúng là bản sao.
kiamlaluno

0

Dường như không thể tìm thấy bất kỳ giải pháp. Vì vậy, tôi đã kết thúc việc xóa chúng khỏi hai bảng đó bằng tay.


Điều này cũng xảy ra với tôi: các trường được tạo trong sản xuất, sao chép nó vào hệ thống thử nghiệm. Hoàn nguyên các lĩnh vực trong sản xuất, sao chép vào hệ thống thử nghiệm một lần nữa. Trong khi đó, Cron có thể đã chạy, do đó cơ sở dữ liệu kiểm tra không bị hủy / tái tạo đúng cách, hai bảng còn lại cho dữ liệu và sửa đổi được giữ xung quanh ... Kết quả: * luôn chạy cron TRƯỚC khi sao lưu * khi nhập vào cơ sở dữ liệu kiểm tra , luôn luôn thả và tạo
Đánh bại Christen

drupal.org/node/1351506 đây vẫn là một vấn đề được biết đến.
Kevin Morse
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.