SHOW VARIABLES 默认查当前会话变量值,等价于 SHOW SESSION VARIABLES;要查全局变量必须显式使用 SHOW GLOBAL VARIABLES,否则如 max_connections 等关键配置将不可见。

SHOW VARIABLES 默认查的是会话变量,不是全局变量——这是最容易误解的地方。
show variables 查到的到底是什么
执行 SHOW VARIABLES 时,MySQL 实际等价于 SHOW SESSION VARIABLES,只返回当前连接的会话级变量值。哪怕你有 SUPER 或 SYSTEM_VARIABLES_ADMIN 权限,它也不会自动切到全局视角。
- 想确认当前命令作用域,可以加
SESSION显式写出来:SHOW SESSION VARIABLES - 如果连
GLOBAL都没写,就别指望看到max_connections、innodb_buffer_pool_size这类真正影响全局行为的值 - 部分变量(如
autocommit)在会话和全局都有同名副本,但值可能不同;仅靠SHOW VARIABLES容易误判配置是否生效
查看所有全局变量的正确命令
必须显式带上 GLOBAL 关键字:
SHOW GLOBAL VARIABLES;
这条命令才真正列出服务器启动后加载的所有全局系统变量,包括那些只能在启动时设置的静态变量(比如 innodb_log_file_size),它们在 SHOW VARIABLES 中根本不会出现。
- 权限要求:需要
SYSTEM_VARIABLES_ADMIN或旧版的SUPER权限 - 输出行数通常比
SHOW VARIABLES多出 20–50 行,尤其在 MySQL 8.0+ 中新增了大量监控和安全相关变量 - 如果执行报错
Access denied,不是语法问题,而是权限不足——此时SELECT @@global.version这类单值查询也可能被拒绝
模糊匹配全局变量时容易漏掉的关键点
用 LIKE 做筛选时,SHOW GLOBAL VARIABLES LIKE '%timeout%' 看似合理,但要注意:
- 通配符匹配的是变量名(
variable_name),不是值;wait_timeout和interactive_timeout都会被命中,但lock_wait_timeout不会——它不含timeout字串,得换关键词查 -
SHOW GLOBAL VARIABLES LIKE 'max%'会漏掉max_execution_time,因为下划线_在LIKE中是通配符,需转义:LIKE 'max_%'(注意反斜杠要双写,在 SQL 字符串里实际是'max\_%') - 更稳妥的方式是用正则:
SHOW GLOBAL VARIABLES WHERE Variable_name REGEXP '^max_'
为什么不能只依赖 SELECT @@global.xxx 查单个变量
虽然 SELECT @@global.max_connections 能快速拿到某个值,但它有硬伤:
- 无法发现变量是否存在:如果拼错变量名(比如
@@global.max_connctions),MySQL 返回NULL而非报错,容易误以为值就是空 - 不显示变量作用域:
@@global前缀强制走全局,但有些变量(如sql_mode)会话级和全局级都可设,仅查全局值看不出当前连接实际生效的是哪个 - 没有默认值提示:
SHOW GLOBAL VARIABLES LIKE 'xxx'至少能确认该变量存在且当前值是多少;而SELECT @@global.xxx对不存在的变量静默失败
真正需要排查配置时,先用 SHOW GLOBAL VARIABLES 过一遍全量列表,再针对性过滤,比靠猜变量名 + 单查更可靠。


















