set global performance_schema = off 无效,因该变量为只读启动参数,修改必须写入配置文件并重启;运行时执行会报错“variable is a read only variable”。

直接关掉 performance_schema 是最简单、最有效的内存节省手段,但必须写进配置文件并重启,运行时 SET GLOBAL 无效。
为什么 SET GLOBAL performance_schema = OFF 不起作用
MySQL 的 performance_schema 是启动时初始化的模块,不是运行时可开关的变量。执行 SET GLOBAL performance_schema = OFF 会报错 ERROR 1238 (HY000): Variable 'performance_schema' is a read only variable。它只接受启动参数控制。
-
SHOW VARIABLES LIKE 'performance_schema'显示ON或OFF,反映的是启动时最终状态,不是当前可修改值 - 试图用
UPDATE performance_schema.setup_consumers关闭采集项,只能停数据写入,预分配内存照占不放 - 哪怕所有
consumers都设为NO,events_statements_history_long这类表仍锁着 128MB+ 内存
怎样正确关闭:必须改 my.cnf 并确认路径生效
MySQL 8.0 启动时只认固定路径的配置文件:/etc/my.cnf → /etc/mysql/my.cnf → /usr/etc/my.cnf → ~/.my.cnf。/www/server/mysql/my.cnf(宝塔常用路径)不在默认列表里,改了也白改。
- 先查 MySQL 实际加载了哪个文件:
ps aux | grep mysqld | grep -o '\-\-defaults-file=[^ ]*';若无输出,说明走默认路径 - 推荐做法:删掉或重命名
/etc/my.cnf(避免它覆盖你改的配置),然后确保/www/server/mysql/my.cnf顶部有[mysqld]段落 - 在
[mysqld]下加一行:performance_schema = OFF - 改完别急着重启,先校验语法:
mysqld --defaults-file=/www/server/mysql/my.cnf --verbose --help | grep "performance_schema",看是否识别为OFF
关掉之后怎么验证真的生效了
重启后不能只看 SHOW VARIABLES,要确认进程 RSS 真实下降、且 performance_schema 库不可访问。
- 执行
SELECT VERSION();确认是 8.0.x,再执行SHOW VARIABLES LIKE 'performance_schema';,结果必须是OFF - 尝试
USE performance_schema;,应报错ERROR 1049 (42000): Unknown database 'performance_schema' - 用
top或ps aux观察mysqld的RES(实际物理内存),对比关闭前后——典型降幅是 300–500MB - 检查错误日志:
tail -n 20 /var/log/mysqld.log,应有类似[Note] Performance Schema disabled的提示
真正容易被忽略的是配置路径和生效验证——很多人改了文件却没生效,还误以为“关不掉”,其实只是 MySQL 根本没读那个文件。关掉 performance_schema 后,所有相关表、监控能力、内存开销一并消失,这是最干净的方案。











