Câu trả lời:
Các mục trong field_config
và field_config_instance
có thể sẽ có giá trị 1
trong deleted
cộ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()
).
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
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ể:
$ 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.
Đố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:
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 đề :)
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.