Comment effacer le cache à l'aide d'une requête SQL?

22

Après une mise à jour du module, mon site est devenu inutilisable et n'affiche qu'un message d'erreur php. J'ai essayé de contourner le problème avec drush cc, mais cela n'a pas aidé.

A également essayé avec un script php personnalisé mais qui a du mal à trouver mon DRUPAL_ROOT

Je veux juste effacer les tables de cache de Drupal 7 directement sur le serveur mysql, mais je ne sais pas quelles tables devraient être effacées pour cela et surtout que je ne devrais pas effacer.

Dois-je simplement effacer toutes les [SITE-PREFIX_]cache*tables?

MOUCHE
la source
Pourriez-vous s'il vous plaît ajouter la requête que vous avez utilisée?
ipwa
en fait, je cherchais une requête à utiliser avec quelque chose comme: `EMPTY WHERE tablename IS LIKE 'prefix_chache%' mais à la fin j'ai juste utilisé phpmyadmin pour supprimer les tables parce que je n'ai pas pu trouver une telle requête.
FLY
Tout comme une note, assurez-vous que vous avez exécuté les mises à jour de la base de données via drush updbou depuis l'interface d'administration, ou en allant simplement /update.phpaprès une mise à jour du module / noyau.
Beebee

Réponses:

6

Tout module bien écrit qui a un cache doit le préfixer avec cache, ce qui signifie que la réponse à votre question est "Oui".

Dans le cas étrange où un module met en cache des données ailleurs, vous pouvez vérifier vos modules pour les implémentations de hook_flush_caches et voir ce qu'ils suppriment.

Létharion
la source
30

Oui, vous pouvez simplement effacer ( TRUNCATE) toutes les cache*tables.

Cela a bien fonctionné pour moi:

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;

Si vous utilisez drush, exécutez drush sql-cliet collez ce qui précède là-dedans.

Ces commandes peuvent ne pas effacer toutes les tables de cache de votre site spécifique, mais elles peuvent aider à corriger certaines erreurs. Ensuite, vous pouvez essayer drush cc alld'effacer le reste.

fifi finance
la source
1
Il est également facile d'ajouter des requêtes TRUNCATE supplémentaires pour toutes les tables cache_ supplémentaires qui pourraient être présentes sur votre site.
millionleaves
11

Pour effacer toutes les tables de cache, exécutez cette commande dans votre terminal serveur.

# 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

cela parcourra toutes les tables de cache et les tronquera en une seule commande.

Mohammad AlQanneh
la source
1
Cela fonctionne, l'a testé et tout est nul.
Marko Blazekovic
1
Cela m'a aidé à relancer un site lorsqu'il contenait des erreurs "Classe non trouvée".
user18099
1
Merci Mohammad, j'aime mieux votre solution à une ligne que la réponse acceptée, car elle est plus flexible: le modèle capture également les tables de cache personnalisées / contrib, pas seulement les listes codées en dur.
Balu Ertl
3

Vous pouvez soit TRONCER / SUPPRIMER chaque table séparément, qui commence cache_comme:

DELETE FROM cache;
DELETE FROM cache_block;

et ainsi de suite (vérifier via drush sqlq "SHOW TABLES LIKE 'cache_%'").

Ou générer une requête avec une liste de tables et passer en drush pour les tronquer, par exemple:

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

Si vous utilisez memcached, vous devez également vider les caches, par exemple (syntaxe Bash):

echo flush_all > /dev/tcp/127.0.0.1/11211
kenorb
la source
0

Ou, vous pouvez importer votre vidage mysql avec des cache*tables déjà tronquées :

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

drush cret / ou drush cc allest censé effacer tous les caches, mais en effet, certaines tables de cache ne sont pas effacées. La commande (simplifiée) suivante tronque tous les caches:

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