MySQL 8.0启动报Unknown system variable 'query_cache_type'需彻底删除my.cnf中所有query_cache_开头的行,因其已从源码中完全移除,配置即报错退出;同时须清理SQL_CACHE语法、验证SHOW VARIABLES LIKE 'query_cache%'返回为空,并检查innodb_buffer_pool_size等替代参数。

MySQL 8.0启动报Unknown system variable 'query_cache_type'怎么办
直接删掉配置文件里所有query_cache_开头的行,不是注释,是整行删除。MySQL 8.0 已从源码中彻底移除整个 Query Cache 模块,变量不存在,配置即报错退出,不会忽略也不会降级。
常见错误现象:
- mysqld 启动失败,日志明确出现
Unknown system variable 'query_cache_type' - 从 MySQL 5.7 升级后服务起不来,但以为是权限或路径问题,反复折腾
操作建议:
- 用
mysqld --validate-config在重启前扫描配置,比靠猜更可靠 - 别只改
my.cnf,phpEnv、Docker 容器、云数据库控制台等环境也得同步清理 - 删完必须重启 mysqld,否则旧配置仍可能被缓存(尤其 systemd 下未 reload)
如何确认 query_cache 相关配置是否真被清干净了
登录 MySQL 后执行 SHOW VARIABLES LIKE 'query_cache%';,结果为空才代表清理到位。如果返回任何值,说明仍有残留或配置文件没生效。
注意两个容易误判的情况:
-
SHOW STATUS LIKE 'Qcache%'在 8.0+ 中也已消失,不能用来验证“是否关闭”,它根本不存在了 - 某些运维脚本或监控工具硬编码了
Qcache_hits查询,升级后会报错或丢数,需同步修改
验证配置加载路径也很关键:
- 执行
SELECT @@global.config_file;(若支持)或mysql --help | grep "Default options"查实际读取的配置文件 - Windows 下 phpEnv 常见路径是
C:\phpEnv\phpEnv\mysql\my.ini,但必须在控制面板里确认“当前配置文件”路径
升级后应用层还调用了 SQL_CACHE 怎么办
SELECT SQL_CACHE ... 在 MySQL 8.0+ 中会直接报错:ERROR 1286 (42000): Unknown table engine 'QUERY CACHE'。这不是警告,是语法解析失败。
这意味着:
- 老 ORM(如早期版本的 Laravel Eloquent、ThinkPHP)若自动生成带
SQL_CACHE的语句,会批量崩溃 - 部分存储过程或视图定义里硬编码了该 hint,升级后首次调用就失败
修复方式:
- 全局搜索代码库里的
SQL_CACHE和SQL_NO_CACHE,全部删掉——它们在 8.0+ 已无意义 - 不要试图用
SET SESSION sql_mode = ''绕过,该 hint 不属于 sql_mode 控制范围 - CI/CD 流水线中加一条检查:grep -r "SQL_CACHE\|SQL_NO_CACHE" ./src/ ,防止漏改
为什么不能用插件或代理“恢复”Query Cache功能
官方不提供、社区也没有安全可靠的替代插件。所有声称“兼容 MySQL 8.0 查询缓存”的方案,本质都是应用层缓存封装,和原生 Query Cache 无关。
根本原因在于语义鸿沟:
- 无法感知 MVCC 快照——同一时刻不同事务看到的数据不同,缓存层做不到精确隔离
- 无法响应隐式 DDL(比如
ALTER TABLE ... RENAME COLUMN),缓存键失效机制完全脱节 - 主从延迟场景下,代理层缓存可能把从库的脏数据当成最新结果返回
真正该做的不是找替代,而是切换思路:
- 热维表 → 改用 Redis + 主动失效(
DEL config:status) - 高频单行读 → 调大
innodb_buffer_pool_size并建覆盖索引 - 聚合统计 → 改用物化表 + 定时刷新,而非依赖不可控的 SQL 缓存
最常被忽略的一点:很多团队花一周调 query_cache_size,却没意识到 innodb_buffer_pool_size 还设在默认的 128M —— 这个参数调对了,90% 的“缓存需求”其实已经满足。


















