Wie lösche ich den Cache mithilfe einer SQL-Abfrage?

21

Nach einem Modul-Update ist meine Site unbrauchbar geworden und zeigt nur eine PHP-Fehlermeldung an. Ich habe versucht, das Problem zu umgehen drush cc, aber das hat nicht geholfen.

Auch mit einem benutzerdefinierten PHP-Skript versucht, aber das hat Probleme bei der Suche nach meinem DRUPAL_ROOT

Ich möchte nur die Cache-Tabellen von Drupal 7 direkt auf dem MySQL-Server löschen, bin mir aber nicht sicher, welche Tabellen dafür gelöscht werden sollen und insbesondere welche ich nicht löschen soll.

Muss ich nur alle [SITE-PREFIX_]cache*Tische abräumen ?

FLIEGE
quelle
Könnten Sie bitte die von Ihnen verwendete Abfrage hinzufügen?
ipwa
Eigentlich suchte ich nach einer Abfrage, die ich verwenden konnte: "EMPTY WHERE tablename IS LIKE" prefix_chache% ", aber am Ende habe ich nur phpmyadmin verwendet, um die Tabellen zu löschen, weil ich eine solche Abfrage nicht finden konnte.
FLIEGE
Stellen Sie drush updblediglich als Hinweis sicher, dass Sie die Datenbankaktualisierungen entweder über oder über die Administrationsoberfläche oder einfach über /update.phpein Modul- / Core-Update ausführen .
Beebee

Antworten:

6

Jedes gut geschriebene Modul, das einen Cache hat, sollte einen Cache als Präfix haben, was bedeutet, dass die Antwort auf Ihre Frage "Ja" lautet.

In dem merkwürdigen Fall, dass ein Modul Daten an einer anderen Stelle zwischenspeichert, können Sie Ihre Module auf Implementierungen von hook_flush_caches überprüfen und feststellen , was sie entfernen.

Letharion
quelle
29

Ja, Sie können einfach TRUNCATEalle cache*Tabellen löschen ( ) .

Das hat bei mir gut funktioniert:

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;

Wenn Sie Drush verwenden, führen Sie drush sql-clidie oben genannten Schritte aus und fügen Sie sie dort ein.

Mit diesen Befehlen werden möglicherweise nicht alle Cache-Tabellen Ihrer Site gelöscht, es können jedoch einige Fehler behoben werden. Anschließend können Sie versuchen drush cc all, den Rest zu löschen.

fifi finanzen
quelle
1
Es ist auch einfach, zusätzliche TRUNCATE-Abfragen für zusätzliche cache_-Tabellen hinzuzufügen, die möglicherweise auf Ihrer Site vorhanden sind.
Millionleaves
11

Führen Sie diesen Befehl in Ihrem Server-Terminal aus, um alle Cache-Tabellen zu löschen.

# 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

Dies durchläuft alle Cache-Tabellen und schneidet sie in einem Befehl ab.

Mohammad AlQanneh
quelle
1
Das funktioniert, getestet und alles ist Null.
Marko Blazekovic
1
Dies hat mir geholfen, eine Site wieder zum Laufen zu bringen, wenn unklare "Klasse nicht gefunden" -Fehler aufgetreten sind.
user18099
1
Danke Mohammad, ich mag Ihre Einzeilerlösung besser als die akzeptierte Antwort, weil sie flexibler ist: Das Muster fängt auch benutzerdefinierte / Contrib-Cache-Tabellen ab, nicht nur die fest codierten Listen.
Balu Ertl
3

Sie können jede Tabelle einzeln TRUNCATE / DELETE, beginnend cache_mit:

DELETE FROM cache;
DELETE FROM cache_block;

und so weiter (überprüfen über drush sqlq "SHOW TABLES LIKE 'cache_%'").

Oder generieren Sie eine Abfrage mit einer Liste von Tabellen und übergeben Sie sie an drush, um sie abzuschneiden. Beispiel:

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

oder:

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

Wenn Sie memcached verwenden, müssen Sie auch die Caches dort leeren, z. B. (Bash-Syntax):

echo flush_all > /dev/tcp/127.0.0.1/11211
Kenorb
quelle
0

Oder Sie können Ihren MySQL-Dump mit bereits abgeschnittenen cache*Tabellen importieren :

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

drush crund / oder drush cc allsoll alle Caches löschen, aber tatsächlich werden einige Cachetabellen nicht gelöscht. Der folgende (vereinfachte) Befehl schneidet alle Caches ab:

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