一,问题背景
近日有项目现场发生了一起严重的生产事故,事故根因之一便为 MySQL 服务器开启了Query Cache;另外,MySQL Query Cache 特性自 2013 年的 MySQL 5.6 版本起便已默认禁用,之后在 2017 年 10 月发布的 MySQL 5.7.20 版本中标记为降级(后续已在 MySQL 8.0 中正式移除),因此,MySQL Query Cache 已成为无任何官方支持的特性,同时,对于其的评
价,一些场景下往往是弊大于利。
二,检查 MySQL Query Cache 是否已启用
登录 MySQL 服务,执行如下 SQL 命令:
mysql> select @@global.query_cache_type;
如 MySQL 服务端未开启 Query Cache,则输出应为 OFF 或者为 0(如下图即为 OFF);
如输出非 OFF 或者非 0,请参考后续章节内容禁用 MySQL Query Cache。
三,禁用 MySQL Query Cache 的方法
1. 以下两个禁用方案请按实际情况二选一执行;
2. 两个方案实际都修改了 MySQL 配置文件,请谨慎修改并做好备份。
3.1. 在线禁用方法
如现场 MySQL 服务不便于安排停机,则可考虑在线禁用。
步骤 1/3:
登录 MySQL 服务端后,执行如下 SQL 命令直接取消 Query Cache 的内存分配:
mysql> set global query_cache_size=0;
步骤 2/3:
使用如下命令备份当前的 MySQL 配置文件,并将备份文件按日期来命名(假设今天为 2020/09/02,则生成的备份文件名为/etc/my.cnf.2020-09-02)。
cp /etc/my.cnf /etc/my.cnf.$(date +%F)
步骤 3/3:
编辑 MySQL 配置文件(默认为/etc/my.cnf),找到query_cache_type 这一行,
在行首增加#以将该行注释,然后保存修改,以使下次重启 MySQL 服务后继续保持禁用Query Cache。
3.2. 停机禁用方法
在线禁用方法虽然修改了/etc/my.cnf 文件,但未重启 MySQL 以验证配置修改无误,因此,如条件允许,可考虑采用此小节停机并修改配置以禁用 Query Cache 的方法。
步骤 1/3:
编辑 MySQL 配置文件(默认为/etc/my.cnf),找到 query_cache_type 这一行,在行首增加#以将该行注释,然后保存修改。
步骤 2/3:
使用如下命令备份当前的 MySQL 配置文件,并将备份文件按日期来命名(假设今天为 2020/09/02,则生成的备份文件名为/etc/my.cnf.2020-09-02)。
cp /etc/my.cnf /etc/my.cnf.$(date +%F)
步骤 3/3:
重启 MySQL 服务,如服务启用异常,请结合 MySQLError Log 来分析处理。