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?


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ą.


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ę.


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.


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

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

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;

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.