Как очистить кеш с помощью SQL-запроса?

22

После обновления модуля мой сайт стал непригодным для использования и отображает только сообщение об ошибке php. Я пытался обойти проблему drush cc, но это не помогло.

Также пробовал с пользовательским сценарием PHP, но это имеет проблемы с поиском моего DRUPAL_ROOT

Я просто хочу очистить таблицы кеша из Drupal 7 непосредственно на сервере mysql, но я не уверен, какие таблицы следует очистить для этого и особенно те, которые я не должен очищать.

Мне просто нужно очистить все [SITE-PREFIX_]cache*таблицы?

FLY
источник
Не могли бы вы добавить запрос, который вы использовали?
ipwa
на самом деле я искал Query для использования с чем-то вроде: `EMPTY WHERE tablename is LIKE 'prefix_chache%', но в конце я просто использовал phpmyadmin для удаления таблиц, потому что я не смог найти такой запрос.
FLY
Просто отметьте, что вы запускаете обновления базы данных либо через drush updbинтерфейс администратора, либо просто переходите /update.phpпосле обновления модуля / ядра.
Биби

Ответы:

6

Любой хорошо написанный модуль, имеющий кеш, должен ставить перед ним кеш, что означает, что ответом на ваш вопрос является «Да».

В нечетном случае, когда модуль кэширует данные где-то еще, вы можете проверить свои модули на предмет реализации hook_flush_caches и посмотреть, что они удаляют.

Letharion
источник
30

Да, вы можете просто очистить ( TRUNCATE) все cache*таблицы.

Это хорошо сработало для меня:

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;

Если вы используете drush, запустите drush sql-cliи вставьте туда выше.

Эти команды могут не очищать все таблицы кеша вашего конкретного сайта, но могут помочь исправить некоторые ошибки. После этого вы можете попытаться drush cc allочистить все остальное.

фифи финанс
источник
1
Также легко добавить дополнительные запросы TRUNCATE для любых дополнительных таблиц cache_, которые могут присутствовать на вашем сайте.
миллион листьев
11

Чтобы очистить все таблицы кеша, запустите эту команду на вашем серверном терминале.

# 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

это перебирает все таблицы кеша и усекает их в одной команде.

Мохаммад АльКаннех
источник
1
Это работает, проверено и все равно нулю.
Марко Блазекович
1
Это помогло мне снова запустить сайт, когда в нем были неясные ошибки «Класс не найден».
user18099
1
Спасибо Мохаммеду, мне нравится ваше однострочное решение лучше, чем принятый ответ, потому что оно более гибкое: шаблон также захватывает таблицы кэша custom / contrib, а не только жестко закодированные списки.
Балу Эртл
3

Вы можете либо TRUNCATE / DELETE каждую таблицу отдельно, которая начинается cache_как:

DELETE FROM cache;
DELETE FROM cache_block;

и так далее (проверьте через drush sqlq "SHOW TABLES LIKE 'cache_%'").

Или сгенерируйте запрос со списком таблиц и перейдите в drush для их усечения, например:

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

или:

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

Если вы используете memcached, вам также необходимо очистить кеши, например (синтаксис Bash):

echo flush_all > /dev/tcp/127.0.0.1/11211
kenorb
источник
0

Или, вы можете импортировать свой дамп mysql с уже усеченными cache*таблицами:

gunzip -c ~/database.sql.gz | grep -v 'INSERT INTO `cache'| mysql --user=root drupal
mrded
источник
0

drush crи / или drush cc allпредполагается очистить все кэши, но на самом деле некоторые таблицы кэшей не очищаются. Следующая (упрощенная) команда усекает все кэши:

drush sql-query "SHOW TABLES LIKE 'cache%'" | while read table; do drush sql-query "TRUNCATE $table"; done;
Вагелис Прокопиу
источник
0

В этой статье JFR предлагается другое гибкое решение на основе шаблонов в виде необработанного SQL-запроса, но оно не работает для меня так хорошо, как Мохаммед: https://thebarton.org/clear-drupal-cache-sql-query /

Балу Эртл
источник