mysql在Ubuntu上配置系统变量与会话变量

来源:这里教程网 时间:2026-02-28 20:45:13 作者:

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
里一眼就能看到。

相关推荐