如何使用SQL查询清除缓存?


21

模块更新后,我的站点已无法使用,并且仅显示php错误消息。我尝试使用解决问题drush cc,但这没有帮助。

还尝试了使用自定义php脚本,但是发现我的问题 DRUPAL_ROOT

我只想直接从mysql服务器上的Drupal 7中清除缓存表,但是我不确定应该为此清除哪些表,尤其是我不应该清除的表。

我是否只需要清除所有[SITE-PREFIX_]cache*表格?


您能否添加您使用的查询?
ipwa 2012年

实际上,我一直在寻找要使用类似以下内容的查询:`EMPTY WHERE tablename IS like'prefix_chache%',但最后我只是使用phpmyadmin删除了表,因为找不到这样的查询。
FLY 2012年

请注意,请确保已通过drush updb管理界面或通过管理界面运行了数据库更新,或者仅/update.php在模块/核心更新之后进行了操作。
蜜蜂

Answers:


6

具有高速缓存的任何编写良好的模块都应在其前面加上高速缓存,这意味着您问题的答案为“是”。

万一某个模块将数据缓存到其他地方,您可以检查模块中hook_flush_caches的实现,并查看它们删除了什么。


29

是的,您只需清除(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
为站点上可能存在的任何其他cache_表添加额外的TRUNCATE查询也很容易。
2015年

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
这可以正常工作,经过测试,所有结果均为零。
Marko Blazekovic,

1
当网站出现不清楚的“找不到类”错误时,这有助于我使网站重新运行。
user18099

1
感谢Mohammad,我更喜欢您的一线解决方案,而不是公认的答案,因为它更灵活:该模式不仅可以捕获硬编码列表,还可以捕获自定义/贡献缓存表。
Balu Ertl

3

您可以分别截断/删除每个表,其开始于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

记忆快取

如果您使用的是memcached,则还需要刷新那里的缓存,例如(Bash语法):

echo flush_all > /dev/tcp/127.0.0.1/11211

0

或者,您可以使用已截断的cache*表导入mysql dump :

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

0

drush cr和/或drush cc all应该清除所有缓存,但实际上某些缓存表没有被清除。以下(简化的)命令不会截断所有缓存:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.