Como limpo o cache usando uma consulta SQL?

21

Após uma atualização do módulo, meu site se tornou inutilizável e mostra apenas uma mensagem de erro php. Tentei contornar o problema drush cc, mas isso não ajudou.

Também tentei com um script php personalizado, mas que tem problemas para encontrar o meu DRUPAL_ROOT

Eu só quero limpar as tabelas de cache do Drupal 7 diretamente no servidor mysql, mas não tenho certeza de quais tabelas devem ser limpas para isso e, especialmente, quais não devo limpar.

Eu só preciso limpar todas as [SITE-PREFIX_]cache*tabelas?

MOSCA
fonte
Você poderia adicionar a consulta que usou?
Ipwa
na verdade, eu estava procurando uma consulta para usar com algo como: `EMPTY WHERE nome da tabela é semelhante a 'prefix_chache%', mas no final eu apenas usei o phpmyadmin para soltar as tabelas porque não consegui encontrar essa consulta.
FLY
Apenas como uma nota, verifique se você executou as atualizações do banco de dados por meio drush updbou a partir da interface administrativa ou simplesmente /update.phpapós uma atualização de módulo / núcleo.
Beebee

Respostas:

6

Qualquer módulo bem escrito que tenha um cache deve prefixá-lo com cache, o que significa que a resposta para sua pergunta é "Sim".

No evento ímpar em que um módulo armazena em cache os dados em outro lugar, você pode verificar se há implementações de hook_flush_caches em seus módulos e ver o que eles removem.

Letharion
fonte
29

Sim, você pode simplesmente limpar ( TRUNCATE) todas as cache*tabelas.

Isto funcionou bem para mim:

TRUNCATE TABLE cache;
TRUNCATE TABLE cache_block;
TRUNCATE TABLE cache_bootstrap;
TRUNCATE TABLE cache_field;
TRUNCATE TABLE cache_filter;
TRUNCATE TABLE cache_form;
TRUNCATE TABLE cache_image;
TRUNCATE TABLE cache_menu;
TRUNCATE TABLE cache_page;
TRUNCATE TABLE cache_path;
TRUNCATE TABLE cache_token;
TRUNCATE TABLE cache_update;

Se você usar drush, execute drush sql-clie cole o que está acima lá.

Esses comandos podem não limpar todas as tabelas de cache do seu site específico, mas podem ajudar a corrigir alguns erros. Depois, você pode tentar drush cc alllimpar o resto.

fifi finanças
fonte
1
Também é fácil adicionar consultas TRUNCATE extras para quaisquer tabelas cache_ adicionais que possam estar presentes no seu site.
millionleaves
11

Para limpar todas as tabelas de cache, execute este comando no terminal do servidor.

# Truncate cache tables in MySQL regardless of the active cache backend
echo "SHOW TABLES LIKE 'cache%'" | $(drush sql-connect) | tail -n +2 | xargs -L1 -I% echo "TRUNCATE TABLE %;" | $(drush sql-connect) -v

isso percorrerá todas as tabelas de cache e as truncará em um comando.

Mohammad AlQanneh
fonte
1
Isso funciona, testou e tudo é zero.
Marko Blazekovic
1
Isso me ajudou a fazer um site funcionar novamente quando não havia erros claros de "Classe não encontrada".
user18099
1
Obrigado Mohammad, eu gosto mais da sua solução de uma linha do que da resposta aceita, porque é mais flexível: o padrão também captura tabelas de cache personalizadas / de contribuição, não apenas as listas codificadas.
Balu Ertl
3

Você pode TRUNCATE / DELETE cada tabela separadamente, a partir de cache_:

DELETE FROM cache;
DELETE FROM cache_block;

e assim por diante (verifique via drush sqlq "SHOW TABLES LIKE 'cache_%'").

Ou gere uma consulta com a lista de tabelas e passe para drush para truncá-las, por exemplo:

echo "SHOW TABLES LIKE 'cache%'" | $(drush sql-connect) | tail -n +2 | xargs -L1 -I% echo "DELETE FROM %;" | $(drush sql-connect) -v

ou:

echo "SELECT CONCAT('DELETE FROM ', GROUP_CONCAT(TABLE_NAME SEPARATOR ';DELETE FROM ') , ' cache;' ) AS statement FROM information_schema.TABLES WHERE TABLE_NAME LIKE 'cache_%'" | drush sqlc --extra=--skip-column-names | drush sqlc

Memcache

Se você estiver usando o memcached, também precisará liberar os caches lá, por exemplo (sintaxe do Bash):

echo flush_all > /dev/tcp/127.0.0.1/11211
kenorb
fonte
0

Ou, você pode importar seu despejo mysql com cache*tabelas já truncadas :

gunzip -c ~/database.sql.gz | grep -v 'INSERT INTO `cache'| mysql --user=root drupal
mrded
fonte
0

drush cre / ou drush cc alldeve limpar todos os caches, mas, de fato, algumas tabelas de cache não são limpas. O seguinte comando (simplificado) trunca todos os caches:

drush sql-query "SHOW TABLES LIKE 'cache%'" | while read table; do drush sql-query "TRUNCATE $table"; done;
Vagelis Prokopiou
fonte