ล้างข้อมูลที่ถูกลบออกจากฐานข้อมูล


9

ฉันสร้างฟิลด์ที่ลบแล้ว ตารางสำหรับเขตข้อมูลหายไปเมื่อทำการลบ แต่ยังอยู่ในfield_configและfield_config_instance

อย่างไรก็ตามมีการทำความสะอาดหรือไม่

ขอบคุณ

คำตอบ:


10

รายการในfield_configและfield_config_instanceอาจจะมีค่าเป็น1ในdeletedคอลัมน์

ซึ่งหมายความว่ามีการทำเครื่องหมายสำหรับการลบ แต่จะไม่ถูกลบออกจริง ๆ จนกว่าคุณจะเรียกใช้ cron (ลบข้อมูลในฟิลด์ที่ถูกลบfield_cron())


คุณคือผู้ชาย ฉันไม่ได้ติดตั้ง phpmyadmin ดังนั้นฉันจึงไม่ตรวจสอบคอลัมน์อื่น ๆ สำหรับตารางทั้งสองนี้ผ่านการเชื่อมต่อ ssh ขอบคุณ Clive
lusketeer

11

ใช้ drush:

$ 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 และสูงถึง 10,000


4

สำหรับผู้ใช้ Drupal 8 ราย

ฉันมีประสบการณ์นี้ยังขุดรหัส ฉันพบเหตุผลทั้งหมดที่ทำให้ฟิลด์ไม่ถูกลบหลังจากที่คุณทำสิ่งต่อไปนี้:

  • ปฏิบัติการ cron gazillion ครั้ง
  • เรียกใช้ 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);
  }
}

ทำ cron เป็นครั้งสุดท้าย ฉันหวังว่ามันจะแก้ไขปัญหา :)


ยินดีต้อนรับสู่ Drupal Answers! โปรดอย่าคัดลอกคำตอบเดียวกันสำหรับคำถามหลายข้อ หากเป็นรายการซ้ำให้ทำเครื่องหมายเป็นรายการซ้ำ
kiamlaluno

-1

ดูเหมือนหาวิธีแก้ปัญหาไม่ได้ ดังนั้นฉันเลยต้องลบมันออกจากตารางทั้งสองด้วยตนเอง


สิ่งนี้เพิ่งเกิดขึ้นกับฉันเช่นกัน: สร้างฟิลด์ในการผลิต, คัดลอกไปยังระบบทดสอบ คืนค่าเขตข้อมูลในการผลิตแล้วคัดลอกไปยังระบบทดสอบอีกครั้ง Cron อาจทำงานในระหว่างนี้ดังนั้นเนื่องจากฐานข้อมูลการทดสอบไม่ได้ถูกลบ / สร้างใหม่อย่างถูกต้องตารางสองที่เหลือสำหรับข้อมูลและการแก้ไขเก็บไว้รอบ ... ผลการวิจัย: * ใช้ cron เสมอก่อนที่จะสำรอง * เมื่อนำเข้าฐานข้อมูลทดสอบ ปล่อยและสร้างอยู่เสมอ
เอาชนะ Christen

drupal.org/node/1351506ยังคงเป็นปัญหาที่ทราบ
Kevin Morse

-1

หากคุณเรียกใช้ drupal cron หลายครั้ง drupal จะลบตารางฟิลด์และเนื้อหาของมัน คุณสามารถทำตามขั้นตอนต่อไปเพื่อเรียกใช้ cron หลายครั้งได้อย่างง่ายดาย แต่ขั้นตอนนี้สามารถบล็อกระบบเว็บหรือโฮสติ้งของคุณได้ แต่คุณสามารถทำได้หากคุณควบคุมระบบของคุณ

  1. ไปที่หน้าสถานะ Drupal (ผู้ดูแลระบบ / รายงาน / สถานะ)
  2. ด้านล่างของหน้าคุณจะเห็นบางสิ่งบางอย่างเช่น "เรียกใช้ cron ด้วยตนเอง" และลิงก์เช่น "เรียกใช้ cron จากภายนอก" และลิงก์ที่มีพารามิเตอร์ cron_key คัดลอกลิงค์นี้
  3. ไปที่เทอร์มินัล (linux หรือ mac terminal)
  4. เขียนคำสั่ง bash ถัดไป:

    ในขณะที่จริง ทำขด [ใส่ลิงค์คัดลอกที่นี่ลบวงเล็บ]; ทำ;

  5. กดปุ่มตกลง. คำสั่งจะถูกดำเนินการไม่ จำกัด จำนวนครั้ง

  6. คุณสามารถไปที่ฐานข้อมูลของคุณเช่น phpmyadmin และมองหาตารางที่มีชื่อ "ลบ" คุณสามารถดูว่าแถวกำลังถูกลบและลงไปได้อย่างไร เมื่อตารางทั้งหมดที่มี "ลบ" ในชื่อว่างเปล่ามันจะถูกลบ เมื่อคุณไม่เห็นตารางที่ถูกลบใด ๆ ในฐานข้อมูลคุณสามารถไปที่ 7 ขั้นตอนสุดท้าย
  7. หยุดคำสั่ง bash ในเทอร์มินัล คุณสามารถกด ctrl + c keys หากไม่สามารถทำได้ให้ปิดเทอร์มินัล

ตามที่ฉันแสดงความคิดเห็นก่อนหน้านี้ไม่ใช่วิธีที่ดีที่สุด แต่ง่ายมันทำงานได้คุณจะไม่ทำอะไรผิดเพราะคุณใช้ cron drupal เท่านั้นดังนั้นคุณสามารถทำลายอะไรด้วยรหัส php ผิด มิฉะนั้นคุณสามารถทำให้เซิร์ฟเวอร์ระบบโฮสติ้งหรือสิ่งอื่น ๆ ในเว็บของคุณอิ่มตัวเพราะขั้นตอนนี้ทำงานได้หลายครั้ง cron และทำให้การใช้ทรัพยากรเว็บ แต่ถ้าคุณมีการควบคุมทรัพยากรไม่มีอะไรมาก ทำความสะอาดโต๊ะหรือแถวหรือคุณรู้ว่าปลอดภัยสำหรับคุณคุณสามารถทำได้

และฉันรู้ว่ามันไม่ใช่ทางออกที่ดีที่สุด แต่มันใช้ได้ผล บางทีมันอาจเป็นทางออกที่ง่ายและดีที่สุดสำหรับสถานการณ์ของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.