데이터베이스에서 삭제 된 필드 정리


9

필드를 삭제했습니다. 필드에 대한 테이블 삭제에 사라,하지만 그들은 여전히 field_configfield_config_instance

어쨌든 그들을 청소해야합니까?

감사

답변:


10

의 항목 field_configfield_config_instance아마의 값을 지니게 되리라 1deleted열을.

즉, 삭제 표시가되어 있지만 cron을 실행할 때까지 실제로 삭제되지 않습니다 (삭제 된 필드 데이터가에서 제거됨 field_cron()).


당신은 남자입니다. phpmyadmin을 설치하지 않았으므로 ssh 연결을 통해 두 테이블에 대한 다른 열을 확인하지 않았습니다. 감사합니다 Clive
lusketeer

11

돌진 사용하기 :

$ drush eval "field_purge_batch(500)"

cron을 실행 한 후에도 몇 번 실행하거나 $ batch_size를 늘려야 field_deleted 및 field_deleted_revision 테이블이 여전히있을 수 있습니다.

질문

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)를 수동으로 실행할 수 있습니다 .

기능을 수동으로 실행하려면 다음 중 하나를 수행하십시오.

  • PHP 파일의 부트 스트랩 Drupal
  • 메뉴 훅 페이지 콜백 생성
  • devel 모듈이 설치되어 있다면 / devel / php를 방문하십시오.

사용할 $ batch_size는 서버 환경과 요구에 따라 다릅니다. 나는 5와 10000의 높은 값을 사용했습니다.


4

Drupal 8 사용자에게는

나는 이것을 경험했다. 코드를 파다. 나는 당신이 한 후에 필드가 삭제되지 않는 이유를 모두 발견했습니다.

  • 크론 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);
  }
}

마지막으로 크론을하십시오. 문제가 해결되기를 바랍니다. :)


Drupal Answers에 오신 것을 환영합니다! 여러 질문에 대해 동일한 답변을 복사하여 붙여 넣지 마십시오. 중복 된 경우 중복으로 플래그를 지정하십시오.
kiamlaluno

-1

해결책을 찾지 못하는 것 같습니다. 그래서 두 테이블에서 수동으로 삭제했습니다.


이것은 나에게도 일어났다. 프로덕션에서 필드를 생성하고 테스트 시스템에 복사했다. 프로덕션의 필드를 되돌리고 테스트 시스템에 다시 복사했습니다. Cron은 그 동안 실행되었을 수 있으므로 테스트 데이터베이스가 올바르게 삭제 / 재 작성되지 않았으므로 데이터 및 개정판에 대한 두 개의 남은 테이블이 유지되었습니다. 결과 : * 백업을 수행하기 전에 항상 cron을 실행하십시오. * 테스트 데이터베이스로 가져올 때 , 항상 drop & create
Christen을

drupal.org/node/1351506 이것은 여전히 ​​알려진 문제입니다.
Kevin Morse

-1

drupal cron을 여러 번 실행하면 drupal이 필드 테이블과 해당 내용을 삭제합니다. 다음 단계에 따라 cron을 여러 번 쉽게 실행할 수 있지만이 단계는 시스템, 웹 또는 호스팅을 차단할 수 있지만 시스템을 제어하는 ​​경우 수행 할 수 있습니다.

  1. Drupal 상태 페이지 (admin / reports / status)로 이동하십시오.
  2. 페이지 아래에 "run cron manual"과 같은 내용과 "cron_key 매개 변수가있는 링크"와 같은 링크가 있습니다. 이 링크를 복사하십시오.
  3. 터미널 (Linux 또는 mac 터미널)로 이동하십시오.
  4. 다음 bash 명령을 작성하십시오.

    사실이지만; 컬을하십시오 [괄호를 삭제하고 복사 된 링크를 여기에 넣으십시오]; 끝난;

  5. 엔터 키를 치시오. 명령은 무제한으로 실행됩니다.

  6. phpmyadmin과 같은 데이터베이스로 가서 "삭제"라는 테이블을 찾을 수 있습니다. 행이 어떻게 삭제되고 내려가는 지 확인할 수 있습니다. 이름에 "delete"가있는 모든 테이블이 비면 삭제됩니다. 데이터베이스에서 삭제 된 테이블을 볼 수 없으면 마지막 7 단계로 이동할 수 있습니다.
  7. 터미널에서 bash 명령을 중지했습니다. ctrl + c 키를 누를 수 있습니다. 당신이 할 수 없다면, 터미널을 닫습니다.

내가 전에 언급했듯이, 최고의 해결책은 아니지만 간단합니다. 작동하지만 drupal cron 만 실행하기 때문에 잘못된 것을하지 않을 것이므로 잘못된 PHP 코드로 무엇이든 깨뜨릴 수 있습니다. 그렇지 않으면 웹에서 서버, 시스템, 호스팅 또는 기타 항목을 포화시킬 수 있습니다.이 단계는 cron을 여러 번 실행하고 웹 리소스 소비를 발생 시키지만 리소스를 제어 할 수있는 경우는 많지 않습니다. 정리할 테이블이나 행 또는 시스템에 안전하게 수행 할 수 있다는 것을 알고 있으면 할 수 있습니다.

그리고 나는 그것이 최선의 해결책이 아니라는 것을 안다. 그러나 작동합니다. 어쩌면 그것은 당신의 상황에 가장 쉽고 가장 좋은 해결책 일 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.