データベースから削除されたフィールドを消去


9

私はそれらを削除したフィールドを作成しました。フィールドのテーブルは削除時に削除されましたが、まだありfield_configfield_config_instance

とにかくそれらをきれいにすることはありますか?

ありがとう

回答:


10

とのエントリにはfield_configfield_config_instanceおそらく列の値が含ま1れていdeletedます。

つまり、削除対象としてマークされていますが、実際にはcronを実行するまで削除されません(削除されたフィールドデータはで削除されますfield_cron())。


あなたは男です。私はphpmyadminをインストールしていなかったので、ssh接続を介してこれら2つのテーブルの他の列をチェックしませんでした。ありがとう、Clive
lusketeer

11

Drushを使用:

$ drush eval "field_purge_batch(500)"

数回実行するか、$ batch_sizeを大きくすると、cronを実行した後でも、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ユーザーの場合、

私もこれを経験し、コードを掘り下げます。私がこれを行った後にフィールドが削除されなかった理由は、次のとおりです。

  • cronガジリオン回実行
  • drush eval "field_purge_batch(500)"を100万回実行します

フィールドは消えないで永続化します。これは、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

0

解決策が見つからないようです。したがって、これらの2つのテーブルから手動で削除することになりました。


これは私にも起こりました。本番環境でフィールドを作成し、テストシステムにコピーしました。本番環境でフィールドを元に戻し、もう一度テストシステムにコピーしました。cronはおそらくその間実行されていたので、テストデータベースが適切に削除/再作成されなかったため、残ったデータとリビジョンの2つのテーブルが残っています...結果:*バックアップを取る前に常にcronを実行*テストデータベースにインポートするとき、常にドロップ&クリエイト
クリステンを倒す

drupal.org/node/1351506これはまだ既知の問題です。
Kevin Morse、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.