Jak wyczyścić pamięć podręczną za pomocą zapytania SQL?

21

Po aktualizacji modułu moja witryna stała się bezużyteczna i wyświetla tylko komunikat o błędzie php. Próbowałem obejść problem drush cc, ale to nie pomogło.

Próbowałem także z niestandardowym skryptem php, ale ma problemy ze znalezieniem mojego DRUPAL_ROOT

Chcę tylko wyczyścić tabele pamięci podręcznej z Drupal 7 bezpośrednio na serwerze mysql, ale nie jestem pewien, które tabele powinny zostać wyczyszczone, a zwłaszcza których nie powinienem wyczyścić.

Czy muszę po prostu wyczyścić wszystkie [SITE-PREFIX_]cache*stoły?

LATAĆ
źródło
Czy możesz dodać zapytanie, którego użyłeś?
ipwa
faktycznie szukałem zapytania do użycia z czymś takim jak: `` PUSTE GDZIE tablename IS LIKE 'prefix_chache%', ale w końcu po prostu użyłem phpmyadmin do usunięcia tabel, ponieważ nie mogłem znaleźć takiego zapytania.
LATA
Dla przypomnienia, upewnij się, że uruchomiłeś aktualizacje bazy danych za pośrednictwem drush updblub z interfejsu administratora, lub po prostu przechodząc do /update.phpaktualizacji modułu / rdzenia.
Beebee,

Odpowiedzi:

6

Każdy dobrze napisany moduł z pamięcią podręczną powinien poprzedzić ją pamięcią podręczną, co oznacza, że ​​odpowiedź na twoje pytanie brzmi „Tak”.

W przypadku, gdy moduł buforuje dane gdzieś indziej, możesz sprawdzić swoje moduły pod kątem implementacji hook_flush_caches i zobaczyć, co one usuwają.

Letharion
źródło
29

Tak, możesz po prostu wyczyścić ( TRUNCATE) wszystkie cache*tabele.

Działa to dla mnie dobrze:

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;

Jeśli używasz drush, uruchom drush sql-clii wklej tam powyższe.

Te polecenia mogą nie wyczyścić wszystkich tabel pamięci podręcznej określonej witryny, ale mogą pomóc naprawić niektóre błędy. Następnie możesz spróbować drush cc allwyczyścić resztę.

finanse fifi
źródło
1
Łatwo jest również dodawać dodatkowe zapytania TRUNCATE dla dowolnych dodatkowych tabel cache_, które mogą znajdować się w Twojej witrynie.
millionleaves
11

Aby wyczyścić wszystkie tabele pamięci podręcznej, uruchom to polecenie w terminalu serwera.

# 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

spowoduje to przejście przez wszystkie tabele pamięci podręcznej i obcięcie ich jednym poleceniem.

Mohammad AlQanneh
źródło
1
To działa, przetestowałem i wszystko jest zerem.
Marko Blazekovic
1
Pomogło mi to uruchomić witrynę ponownie, gdy pojawiły się niejasne błędy „Nie znaleziono klasy”.
user18099
1
Dzięki Mohammad, bardziej podoba mi się twoje rozwiązanie z jedną linią niż zaakceptowana odpowiedź, ponieważ jest bardziej elastyczne: wzór przechwytuje również niestandardowe / contrib tabele pamięci podręcznej, nie tylko listy zakodowane na stałe.
Balu Ertl
3

Możesz TRUNCATE / DELETE każdą tabelę osobno, zaczynającą się od cache_:

DELETE FROM cache;
DELETE FROM cache_block;

i tak dalej (sprawdź przez drush sqlq "SHOW TABLES LIKE 'cache_%'").

Lub wygeneruj zapytanie z listą tabel i przejdź do drush, aby je obciąć, np .:

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

lub:

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

Pamięć podręczna

Jeśli używasz memcached, musisz również opróżnić tam pamięci podręczne, np. (Składnia Bash):

echo flush_all > /dev/tcp/127.0.0.1/11211
kenorb
źródło
0

Możesz też zaimportować zrzut pamięci mysql z już obciętymi cache*tabelami:

gunzip -c ~/database.sql.gz | grep -v 'INSERT INTO `cache'| mysql --user=root drupal
mrded
źródło
0

drush cri / lub drush cc allma wyczyścić wszystkie pamięci podręczne, ale w rzeczywistości niektóre tabele pamięci podręcznej nie zostaną wyczyszczone. Następująca (uproszczona) komenda obciąża wszystkie pamięci podręczne:

drush sql-query "SHOW TABLES LIKE 'cache%'" | while read table; do drush sql-query "TRUNCATE $table"; done;
Vagelis Prokopiou
źródło