SHOW VARIABLES 仅显示运行时可读的系统变量,不包括已废弃、启动时只读、插件专属(未加载)及需显式启用(如 performance_schema 关闭时相关变量不显示)的配置;变量名须全小写,模糊匹配用%;默认查当前会话生效值,但不标明来源;修改用 SET SESSION 或 SET GLOBAL(需 SUPER 权限);MySQL 8.0+ 可用 performance_schema.variables_info 查作用域、来源与修改状态;my.cnf 配置未显示常因未加载或被动态覆盖,应以 SELECT @@global.xxx 确认实际值。

SHOW VARIABLES 为什么查不到你想要的变量
不是所有 MySQL 配置项都出现在 SHOW VARIABLES 结果里。它只显示「运行时可读」的系统变量,不包括:已废弃的变量、仅在启动时生效的只读配置(如 innodb_data_home_dir)、插件专属变量(除非插件已加载),以及部分动态变量需显式启用后才可见(比如 performance_schema 关闭时,相关变量不会列出)。
常见错误现象:SHOW VARIABLES LIKE 'max_connections'; 能查到,但 SHOW VARIABLES LIKE 'wait_timeout'; 返回空——大概率是拼写错误或大小写敏感(MySQL 8.0+ 默认大小写敏感,变量名全小写)。
- 始终用小写查询变量名:
SHOW VARIABLES LIKE 'log_error';,别写'Log_Error' - 模糊匹配加百分号:
SHOW VARIABLES LIKE '%timeout%';,避免漏掉interactive_timeout这类长名 - 想看全部?直接
SHOW VARIABLES;,但结果可能超 500 行,建议配合客户端分页或导出后 grep
GLOBAL 和 SESSION 变量的区别到底影响什么
SHOW VARIABLES 默认显示的是当前会话(SESSION)视角的值,但它实际展示的是「该变量当前生效值」——对只读变量(如 version)和全局变量(如 max_connections)来说,SESSION 和 GLOBAL 值通常一致;但对会话级变量(如 sql_mode、autocommit),不同连接可能看到不同值,而 SHOW VARIABLES 不会告诉你这个值来自 SESSION 还是 GLOBAL。
真正关键的是修改行为:SET SESSION xxx = yyy 只影响当前连接;SET GLOBAL xxx = yyy 才改全局,且要求 SUPER 权限。没权限时执行 SET GLOBAL 会报错 ERROR 1227 (42501): Access denied。
- 确认变量作用域:查文档或执行
SELECT VARIABLE_NAME, VARIABLE_SCOPE FROM performance_schema.variables_info WHERE VARIABLE_NAME = 'xxx';(MySQL 8.0+) - 临时调参测试用
SET SESSION,避免误动全局 - 修改
GLOBAL后,已有连接不受影响,新连接才继承新值
MySQL 8.0+ 的 performance_schema.variables_info 更准吗
是的。performance_schema.variables_info 是 MySQL 8.0 引入的元数据表,能明确告诉你每个变量是否可动态修改、作用域、默认值、是否已变更过,比 SHOW VARIABLES 多一层「可信度标注」。比如它会标记 read_only 的 VARIABLE_SOURCE 是 COMPILED 还是 CONFIG,帮你快速定位配置来源。
但注意:它依赖 performance_schema 开启(默认开),且只记录「已加载」的变量。如果某个插件没启用(如 audit_log),对应变量也不会出现在这张表里。
- 查变量来源:
SELECT VARIABLE_NAME, VARIABLE_SOURCE, VARIABLE_PATH FROM performance_schema.variables_info WHERE VARIABLE_NAME = 'innodb_buffer_pool_size'; - 找被手动改过的变量:
SELECT * FROM performance_schema.variables_info WHERE IS_MODIFIED = 'YES'; - 兼容性代价:MySQL 5.7 及更早版本无此表,不能跨版本盲用
my.cnf 里的配置为什么 SHOW VARIABLES 里看不到
最常见原因:MySQL 启动时没读到那个配置文件,或者读到了但变量被后续动态设置覆盖了。MySQL 按固定顺序查找配置文件(/etc/my.cnf → /etc/mysql/my.cnf → SYSCONFDIR/my.cnf → $MYSQL_HOME/my.cnf → defaults-extra-file → ~/.my.cnf),漏掉任意一环都可能导致配置未生效。
另一个隐形坑:配置文件语法错误(比如多了一个等号、引号不闭合)会让 MySQL 忽略整段,但不报错——只会用内置默认值启动。
- 确认实际加载了哪个文件:
mysqld --verbose --help | grep "Default options" - 验证配置是否被识别:
mysql -e "SELECT @@global.innodb_buffer_pool_size;"对比 my.cnf 里写的值 - 重启后仍不对?检查 error log,搜索
Could not open required defaults file或unknown variable
变量值是否生效,最终得看 SELECT @@global.xxx 或 SELECT @@session.xxx 的返回结果,而不是配置文件写了什么。很多问题卡在「以为改了,其实没加载」或者「改了 GLOBAL,却在 SESSION 里查」——这两个点最容易反复踩。


















