代码改变世界

MySQL 系统变量和 SET 命令

  abce  阅读(171)  评论(0编辑  收藏  举报

MySQL 的系统变量配置了 MySQL Server 如何运行,SET 语句用于修改系统变量。MySQL SET 命令有多种选项,用于指定如何以及何时修改系统变量。重要的是要了解这些修改如何反映在当前会话(连接)、以后的会话以及数据库服务器重启后。

 

用户可以使用 SET 修改的变量由其权限级别决定。系统变量有不同的作用域:global、session

 

SET 命令的语法:

1
2
3
4
5
6
7
8
9
10
11
SET variable = expr [, variable = expr] ...
 
variable: {
    user_var_name
  | param_name
  | local_var_name
  | {GLOBAL | @@GLOBAL.} system_var_name
  | {PERSIST | @@PERSIST.} system_var_name
  | {PERSIST_ONLY | @@PERSIST_ONLY.} system_var_name
  | [SESSION | @@SESSION. | @@] system_var_name
}

 

对于系统变量,要知道以下一些内容:

· 有些系统变量是动态的,会立即改变 MySQL Server 的行为

· 有些系统变量不修改 MySQL Server 运行时的行为,需要重启

· 有些系统变量可以修改 MySQL Server 运行时的行为,但是 dba 可以选择在重启后再应用

· 有些系统变量修改 MySQL Server 运行时的行为,但是重启后不会被持久化

· 有些系统变量修改只能应用于新建的连接,对于已有的连接不生效

 

考虑到上述可能性,为了更好地理解各种情况,接下来将通过示例回顾实际工作中的情况。

 

每个系统变量都包含各种属性。与此相关的 2 个属性是:适用范围(global、session、或同时支持global和session)、是否支持动态修改。

 

如果修改了全局系统变量,且该值对会话(连接)有影响,则该值将在会话初始化时使用。 因此,在设置全局值之前的任何现有连接都不会 "继承" 该值,只有新会话才会修改该设置。此外,根据 SET 命令,当重新启动时,对全局值的修改可能会被持久化,也可能不会被持久化。

 

以max_connections 为例:

 

用例1: set global

假设你想将 max_connections从默认值151修改成1000。如果执行以下命令:

1
MySQL> SET GLOBAL max_connections = 1000;

此前所有已存在的会话的 max_connections 设置是151;所有新建的连接的max_connections是1000;如果 mysql server 发生重启,重启后 max_connections还是151。

 

用例2: set persist

如果要修改新会话的 max_connections,并在重启后将所有会话设置为 1000,则需要将修改持久化。

1
MySQL> SET PERSIST max_connections = 1000;

 

用例3:set persist_only

还有另一个选择。你可能不想更改当前正在运行的服务器的值,在这种情况下,可以将值保留为 151,但在重新启动时,希望将值改为 1000。在这种情况下,您可以执行

1
MySQL> SET PERSIST_ONLY max_connections = 1000;

PERSIST 和 PERSIST ONLY 语句的结果都是写入新值,在本例中就是将 max_connections=1000 写入 mysqld-auto.cnf 文件。

 

用例4:reset/set成默认值

如果想设置成默认值,有两个选择:

1.重新设置并持久化,以下将mysqld-auto.cnf中值设置成默认值

1
MySQL> SET PERSIST max_connections = DEFAULT;

2.移除mysqld-auto.cnf中的设置同时设置成默认值

1
MySQL> RESET PERSIST max_connections;

 

如果想在会话级别修改 max_connections呢?

对于全局的变量,使用 set session 命令修改会报错。

1
2
MySQL> SET SESSION max_connections=1000;
ERROR: 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL

SESSION 变量只在设置它们的当前会话中有效。

 

动态变量和非动态变量的区别

如果变量是动态的,通过set 设置后会立即应用和将变化反应到mysql server;如果和会话相关的,只会应用到新的会话。可以被持久化,也可以不持久化。

如果是非动态的,只可以使用set persist_only进行修改,生效需要重启mysql server。

 

了解自己的变量设置

show variables 命令可以提供全局变量和会话变量的活跃值:

1
2
3
show variables like 'max_connections';
show global variables like 'max_connections';
show session  variables like 'max_connections';

 

此外,还可以通过performance_schema中的表进行查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#全局变量
select * from performance_schema.global_variables;
 
#会话变量
select * from performance_schema.session_variables;
 
#与线程相关的变量,根据线程id进行区分
select * from performance_schema.variables_by_thread;
 
#持久的变量,设置在mysqld-auto.cnf中的值
select * from performance_schema.persisted_variables;
 
#变量信息:变量设置的来源,值的范围,设置时间等
select * from performance_schema.variables_info;
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2020-12-08 explain命令可能会修改MySQL数据
2015-12-08 Linux普通用户使用sudo权限启停apache服务
点击右上角即可分享
微信分享提示