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权限,且仅对后续新连接生效(不影响已存在的会话):
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里一眼就能看到。
