MySQL 系统变量和 SET 命令
2024-12-08 18:32 abce 阅读(28) 评论(0) 编辑 收藏 举报MySQL 的系统变量配置了 MySQL Server 如何运行,SET 语句用于修改系统变量。MySQL SET 命令有多种选项,用于指定如何以及何时修改系统变量。重要的是要了解这些修改如何反映在当前会话(连接)、以后的会话以及数据库服务器重启后。
用户可以使用 SET 修改的变量由其权限级别决定。系统变量有不同的作用域:global、session
SET 命令的语法:
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。如果执行以下命令:
MySQL> SET GLOBAL max_connections = 1000;
此前所有已存在的会话的 max_connections 设置是151;所有新建的连接的max_connections是1000;如果 mysql server 发生重启,重启后 max_connections还是151。
用例2: set persist
如果要修改新会话的 max_connections,并在重启后将所有会话设置为 1000,则需要将修改持久化。
MySQL> SET PERSIST max_connections = 1000;
用例3:set persist_only
还有另一个选择。你可能不想更改当前正在运行的服务器的值,在这种情况下,可以将值保留为 151,但在重新启动时,希望将值改为 1000。在这种情况下,您可以执行
MySQL> SET PERSIST_ONLY max_connections = 1000;
PERSIST 和 PERSIST ONLY 语句的结果都是写入新值,在本例中就是将 max_connections=1000 写入 mysqld-auto.cnf 文件。
用例4:reset/set成默认值
如果想设置成默认值,有两个选择:
1.重新设置并持久化,以下将mysqld-auto.cnf中值设置成默认值
MySQL> SET PERSIST max_connections = DEFAULT;
2.移除mysqld-auto.cnf中的设置同时设置成默认值
MySQL> RESET PERSIST max_connections;
如果想在会话级别修改 max_connections呢?
对于全局的变量,使用 set session 命令修改会报错。
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 命令可以提供全局变量和会话变量的活跃值:
show variables like 'max_connections'; show global variables like 'max_connections'; show session variables like 'max_connections';
此外,还可以通过performance_schema中的表进行查看:
#全局变量 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;