系统变量(GLOBAL)影响整个MySQL实例且需SUPER权限,部分须重启生效;会话变量(SESSION)仅当前连接有效,无需权限可动态修改。

MySQL 系统变量和会话变量的区别在哪
系统变量(GLOBAL)影响整个 MySQL 实例,所有新连接都会继承它的值;会话变量(SESSION 或 LOCAL)只对当前连接生效,断开即失效。修改系统变量需要 SUPER 权限,且部分变量不支持运行时修改(比如 innodb_buffer_pool_size 必须写进配置文件重启生效)。
常见误区是以为 SET GLOBAL xxx = yyy 能永久生效——它只是内存中临时改,MySQL 重启就回退。真要持久化,必须写进配置文件。
如何在 Ubuntu 上永久设置系统变量(my.cnf)
Ubuntu 的 MySQL 配置文件通常在 /etc/mysql/my.cnf,但实际加载顺序可能是:/etc/mysql/my.cnf → /etc/mysql/conf.d/*.cnf → /etc/mysql/mysqld.conf.d/*.cnf。推荐把自定义配置放进 /etc/mysql/conf.d/ 下的独立文件(如 /etc/mysql/conf.d/custom.cnf),避免污染主配置。
示例:设置最大连接数和查询缓存(注意:MySQL 8.0+ 已移除 query_cache_type,别乱加):
[mysqld] max_connections = 500 wait_timeout = 300 interactive_timeout = 300 # MySQL 8.0 不再支持以下两行,加了会启动失败 # query_cache_type = 0 # query_cache_size = 0
改完后必须重启服务:sudo systemctl restart mysql。用 sudo systemctl status mysql 确认是否成功启动,失败时看日志:sudo journalctl -u mysql -n 50 --no-pager。
如何动态修改会话变量与系统变量(SQL 命令)
会话级修改最常用,不需要权限,适合调试或单次调优:
-
SET SESSION sort_buffer_size = 4194304;(设为 4MB) -
SET @myvar = 'hello';(用户变量,仅当前会话可用)
系统级修改需有 SUPER 权限,且仅对后续新连接生效(不影响已存在的会话):
PHP商城系统是国内领先商城系统,网店系统,购物系统,网上商城系统,B2C商城系统产品.同时也是一个商业的PHP开发框架。PHP 商城系统由内容、文章、会员、留言、订单、 财务、广告、短消息、数据库管理、营销推广、内置支付管理、商品配送管理、无限级分类、全站搜索等多个功能模块插件组成。在当今瞬机万变的市场环境中,快速高效的IT解决方案是您业务成功的关键。我们PHP商城系统能为您量身打造完全符合需求
SET GLOBAL max_connections = 600;-
SET GLOBAL innodb_log_file_size = 268435456;(这个变量不能动态改!执行会报错ERROR 1238 (HY000): Variable 'innodb_log_file_size' is a read only variable)
验证是否生效:
- 查会话值:
SELECT @@sort_buffer_size;或SHOW VARIABLES LIKE 'sort_buffer_size'; - 查全局值:
SELECT @@global.sort_buffer_size;
哪些变量必须重启?哪些可以热更新?
不是所有 GLOBAL 变量都能在线改。判断依据看官方文档的 Dynamic 列,或者执行:
SELECT VARIABLE_NAME, VARIABLE_SCOPE, IS_DYNAMIC
FROM performance_schema.variables_info
WHERE VARIABLE_NAME IN ('max_connections', 'innodb_buffer_pool_size');典型「必须重启」的变量:innodb_buffer_pool_size、innodb_log_file_size、datadir、socket;
典型「可热更新」的变量:max_connections、wait_timeout、net_read_timeout、sort_buffer_size(会话级)。
最容易被忽略的是:Ubuntu 上用 systemd 管理 MySQL,有时改了 my.cnf 却忘了 sudo systemctl daemon-reload(其实一般不用,因为 mysql 服务没用 EnvironmentFile,但重启服务本身已足够)。真正容易卡住的是路径权限错误、SELinux(Ubuntu 默认没开)、或配置语法多了一个逗号/少了一个括号——这些错误在 journalctl 里一眼就能看到。









