Limpar campo excluído do banco de dados

9

Eu criei campos que foram excluídos. As tabelas dos campos foram eliminadas, mas ainda estão dentro field_configefield_config_instance

Existe alguma maneira de limpá-los?

obrigado

lusketeer
fonte

Respostas:

10

As entradas field_confige field_config_instanceprovavelmente terão um valor de 1na deletedcoluna.

Isso significa que eles estão marcados para exclusão, mas na verdade não serão excluídos até você executar o cron (os dados do campo excluído são eliminados field_cron()).

Clive
fonte
você é o cara. Eu não tinha o phpmyadmin instalado, então não verifiquei outras colunas para essas duas tabelas através da conexão ssh. Obrigado Clive
lusketeer
11

usando drush:

$ drush eval "field_purge_batch(500)"

pode ser necessário executar algumas vezes ou aumentar o $ batch_size; ainda pode haver tabelas field_deleted e field_deleted_revision, mesmo após executar cron

inquerir

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

se você ficar vazio, poderá excluir com segurança essas tabelas restantes

decibel.places
fonte
Esta é uma ótima resposta, obrigado @ decibel.places!
Joelpittet 19/05/19
6

Como alternativa à execução do cron para remover os dados excluídos, você pode executar manualmente field_purge_batch ($ batch_size) .

Para executar manualmente a função, você pode:

  • Bootstrap Drupal em um arquivo php
  • Criar um retorno de chamada da página de gancho de menu
  • Se você possui o módulo devel instalado, visite / devel / php

O $ batch_size a ser usado variará dependendo do ambiente e das necessidades do servidor. Eu usei valores tão baixos quanto 5 e tão altos quanto 10000.

Cody Craven
fonte
4

Para os usuários do Drupal 8,

Eu experimentei isso também, desenterrar o código. Encontrei esse motivo por que os campos não foram excluídos depois de você, o seguinte:

  • executando cron gazillion times
  • execute drush eval "field_purge_batch (500)" milhão de vezes

Os campos persistem e não desaparecem, isso devido a uma parte da lógica aqui, em 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;
  }

Os módulos dependentes são desinstalados. essa é a razão pela qual os campos não são removidos.

Como resolver isso? Recomenda-se uma abordagem para reinstalar o módulo primeiro, limpar esses campos e desinstalar novamente. Para descobrir qual módulo você precisa reinstalar:

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

Caso você não queira seguir essa abordagem de reinstalar o módulo, você também pode excluir imediatamente, não tenho certeza qual é o comportamento, mas ele deve fazer o trabalho.

Backup primeiro !!!

Sim, não seja preguiçoso, ele vai salvar sua bunda, se algo der errado.

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

Faça o cron pela última vez. Espero que isso resolva o problema :)

kororo
fonte
Bem-vindo ao Drupal Answers! Não copie e cole a mesma resposta para várias perguntas. Se eles são duplicados, sinalize-os como duplicados.
kiamlaluno
0

Não consigo encontrar nenhuma solução. Então, acabei excluindo-os dessas duas tabelas manualmente.

lusketeer
fonte
Isso também aconteceu comigo: criou campos na produção, copiou para o sistema de teste. Reverteu os campos em produção, copiados para o sistema de teste novamente. O Cron provavelmente foi executado nesse meio tempo, portanto, como o banco de dados de teste não foi descartado / recriado corretamente, as duas tabelas restantes para dados e revisões foram mantidas por aí ... Resultados: * sempre execute o cron ANTES de fazer um backup * ao importar para um banco de dados de teste , sempre soltar e criar
batida Christen
drupal.org/node/1351506 esse ainda é um problema conhecido.
Kevin Morse