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
}
SET
语法用于变量赋值,使您可以为影响服务器或客户端操作的不同类型的变量赋值
用户定义变量。参见 第 11.4 节,“用户定义变量”.
存储过程和函数参数,以及存储程序局部变量。参见 第 15.6.4 节,“存储程序中的变量”.
系统变量。参见 第 7.1.8 节,“服务器系统变量”。系统变量也可以在服务器启动时设置,如 第 7.1.9 节,“使用系统变量” 中所述。
一个 SET
语句,它分配变量值不会写入二进制日志,因此在复制场景中,它只影响您执行它的主机。要影响所有复制主机,请在每个主机上执行该语句。
以下部分描述了用于设置变量的 SET
语法。它们使用 =
赋值运算符,但此目的也允许使用 :=
赋值运算符。
用户定义变量是在会话内本地创建的,并且仅存在于该会话的上下文中;参见 第 11.4 节,“用户定义变量”。
用户定义变量写为 @
,并按如下方式分配表达式值var_name
SET @var_name = expr;
示例
SET @name = 43;
SET @total_tax = (SELECT SUM(tax) FROM taxable_transactions);
如这些语句所示,expr
的范围可以从简单(文字值)到更复杂(标量子查询返回的值)。
Performance Schema user_variables_by_thread
表包含有关用户定义变量的信息。参见 第 29.12.10 节,“Performance Schema 用户定义变量表”。
SET
应用于存储对象中定义的参数和局部变量。以下过程使用 increment
过程参数和 counter
局部变量
CREATE PROCEDURE p(increment INT)
BEGIN
DECLARE counter INT DEFAULT 0;
WHILE counter < 10 DO
-- ... do work ...
SET counter = counter + increment;
END WHILE;
END;
MySQL 服务器维护配置其操作的系统变量。系统变量可以具有影响整个服务器操作的全局值、影响当前会话的会话值,或两者兼而有之。许多系统变量是动态的,可以使用 SET
语句在运行时更改,以影响当前服务器实例的操作。 SET
还可以用于将某些系统变量持久保存到数据目录中的 mysqld-auto.cnf
文件中,以影响服务器在后续启动时的操作。
如果对敏感系统变量发出 SET
语句,则会在将查询记录到常规日志和审核日志之前将其重写,以将值替换为 “<redacted>
”。即使服务器实例上没有通过密钥环组件提供安全存储,也会发生这种情况。
如果更改会话系统变量,则该值将在您的会话中保持有效,直到您将变量更改为其他值或会话结束。更改不会影响其他会话。
如果更改全局系统变量,则该值将被记住并用于初始化新会话的会话值,直到您将变量更改为其他值或服务器退出。更改对访问全局值的任何客户端都是可见的。但是,更改仅影响连接后客户端的相应会话值。全局变量更改不会影响任何当前客户端会话(甚至发生全局值更改的会话)的会话值。
要使全局系统变量设置持久化,以便它在服务器重启时应用,您可以将其持久化到数据目录中的 mysqld-auto.cnf
文件中。还可以通过手动修改 my.cnf
选项文件来进行持久配置更改,但这更繁琐,并且手动输入的设置中的错误可能要到很久以后才能被发现。 SET
语句持久化系统变量更方便,避免了语法错误设置的可能性,因为语法错误的设置不会成功,也不会更改服务器配置。有关持久化系统变量和 mysqld-auto.cnf
文件的更多信息,请参见 第 7.1.9.3 节,“持久化系统变量”。
设置或持久化全局系统变量值始终需要特殊权限。设置会话系统变量值通常不需要特殊权限,任何用户都可以执行,但也有例外。有关更多信息,请参见 第 7.1.9.1 节,“系统变量权限”。
以下讨论描述了设置和持久化系统变量的语法选项
要将值分配给全局系统变量,请在变量名前添加
GLOBAL
关键字或@@GLOBAL.
限定符SET GLOBAL max_connections = 1000; SET @@GLOBAL.max_connections = 1000;
要将值分配给会话系统变量,请在变量名前添加
SESSION
或LOCAL
关键字,添加@@SESSION.
、@@LOCAL.
或@@
限定符,或不添加任何关键字或修饰符SET SESSION sql_mode = 'TRADITIONAL'; SET LOCAL sql_mode = 'TRADITIONAL'; SET @@SESSION.sql_mode = 'TRADITIONAL'; SET @@LOCAL.sql_mode = 'TRADITIONAL'; SET @@sql_mode = 'TRADITIONAL'; SET sql_mode = 'TRADITIONAL';
客户端可以更改自己的会话变量,但不能更改任何其他客户端的会话变量。
要将全局系统变量持久保存到数据目录中的
mysqld-auto.cnf
选项文件中,请在变量名前添加PERSIST
关键字或@@PERSIST.
限定符SET PERSIST max_connections = 1000; SET @@PERSIST.max_connections = 1000;
此
SET
语法使您能够在运行时进行配置更改,这些更改也会在服务器重启时持久保存。与SET GLOBAL
一样,SET PERSIST
设置全局变量运行时值,但也将变量设置写入mysqld-auto.cnf
文件(如果存在,则替换任何现有变量设置)。要将全局系统变量持久保存到
mysqld-auto.cnf
文件中,而无需设置全局变量运行时值,请在变量名前添加PERSIST_ONLY
关键字或@@PERSIST_ONLY.
限定符SET PERSIST_ONLY back_log = 100; SET @@PERSIST_ONLY.back_log = 100;
与
PERSIST
一样,PERSIST_ONLY
将变量设置写入mysqld-auto.cnf
。但是,与PERSIST
不同,PERSIST_ONLY
不会修改全局变量运行时值。这使得PERSIST_ONLY
适合配置只能在服务器启动时设置的只读系统变量。
要将全局系统变量值设置为编译后的 MySQL 默认值,或将会话系统变量设置为当前相应的全局值,请将变量设置为 DEFAULT
值。例如,以下两个语句在将 max_join_size
的会话值设置为当前全局值方面是相同的
SET @@SESSION.max_join_size = DEFAULT;
SET @@SESSION.max_join_size = @@GLOBAL.max_join_size;
使用 SET
将全局系统变量持久化为 DEFAULT
值或其文字默认值会将变量分配其默认值并将变量的设置添加到 mysqld-auto.cnf
。要从文件中删除变量,请使用 RESET PERSIST
。
某些系统变量不能持久保存,或者持久保存受限。参见 第 7.1.9.4 节,“不可持久和持久受限系统变量”。
由插件实现的系统变量可以在执行 SET
语句时安装插件的情况下持久保存。如果插件仍然安装,则在后续服务器重启时,已持久保存的插件变量的分配生效。如果插件不再安装,则当服务器读取 mysqld-auto.cnf
文件时,插件变量将不再存在。在这种情况下,服务器会将警告写入错误日志并继续
currently unknown variable 'var_name'
was read from the persisted config file
要显示系统变量名称和值
几个 Performance Schema 表提供系统变量信息。参见 第 29.12.14 节,“Performance Schema 系统变量表”。
Performance Schema
variables_info
表包含显示每个系统变量最近一次设置的时间以及由哪个用户设置的信息。参见 第 29.12.14.2 节,“Performance Schema variables_info 表”。Performance Schema
persisted_variables
表为mysqld-auto.cnf
文件提供 SQL 接口,使能够使用SELECT
语句在运行时检查其内容。参见 第 29.12.14.1 节,“Performance Schema persisted_variables 表”。
如果 SET
语句中的任何变量赋值失败,则整个语句都会失败,并且不会更改任何变量,也不会更改 mysqld-auto.cnf
文件。
SET
在此处描述的情况下会产生错误。大多数示例显示使用关键字语法的 SET
语句(例如,GLOBAL
或 SESSION
),但这些原则也适用于使用相应修饰符的语句(例如,@@GLOBAL.
或 @@SESSION.
)。
使用
SET
(任何变体)设置只读变量mysql> SET GLOBAL version = 'abc'; ERROR 1238 (HY000): Variable 'version' is a read only variable
使用
GLOBAL
、PERSIST
或PERSIST_ONLY
设置仅具有会话值的变量mysql> SET GLOBAL sql_log_bin = ON; ERROR 1228 (HY000): Variable 'sql_log_bin' is a SESSION variable and can't be used with SET GLOBAL
使用
SESSION
设置仅具有全局值的变量mysql> SET SESSION max_connections = 1000; ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL
省略
GLOBAL
、PERSIST
或PERSIST_ONLY
设置仅具有全局值的变量mysql> SET max_connections = 1000; ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL
使用
PERSIST
或PERSIST_ONLY
设置无法持久保存的变量mysql> SET PERSIST port = 3307; ERROR 1238 (HY000): Variable 'port' is a read only variable mysql> SET PERSIST_ONLY port = 3307; ERROR 1238 (HY000): Variable 'port' is a non persistent read only variable
@@GLOBAL.
、@@PERSIST.
、@@PERSIST_ONLY.
、@@SESSION.
和@@
修饰符仅适用于系统变量。尝试将它们应用于用户定义变量、存储过程或函数参数或存储程序局部变量会导致错误。并非所有系统变量都可以设置为
DEFAULT
。在这种情况下,将DEFAULT
分配会导致错误。尝试将
DEFAULT
分配给用户定义变量、存储过程或函数参数或存储程序局部变量会导致错误。
SET
语句可以包含多个变量赋值,用逗号分隔。此语句将值分配给用户定义变量和系统变量
SET @x = 1, SESSION sql_mode = '';
如果在一个语句中设置多个系统变量,则语句中最近的 GLOBAL
、PERSIST
、PERSIST_ONLY
或 SESSION
关键字将用于后续未指定关键字的赋值。
多个变量赋值的示例
SET GLOBAL sort_buffer_size = 1000000, SESSION sort_buffer_size = 1000000;
SET @@GLOBAL.sort_buffer_size = 1000000, @@LOCAL.sort_buffer_size = 1000000;
SET GLOBAL max_connections = 1000, sort_buffer_size = 1000000;
@@GLOBAL.
、@@PERSIST.
、@@PERSIST_ONLY.
、@@SESSION.
和 @@
修饰符仅应用于紧随其后的系统变量,而不应用于任何剩余的系统变量。此语句将 sort_buffer_size
全局值设置为 50000,会话值设置为 1000000
SET @@GLOBAL.sort_buffer_size = 50000, sort_buffer_size = 1000000;
要在表达式中引用系统变量的值,请使用其中一个 @@
修饰符(除了 @@PERSIST.
和 @@PERSIST_ONLY.
,它们在表达式中不允许)。例如,您可以在 SELECT
语句中检索系统变量值,如下所示
SELECT @@GLOBAL.sql_mode, @@SESSION.sql_mode, @@sql_mode;
在表达式中对系统变量的引用,如 @@
(使用 var_name
@@
而不是 @@GLOBAL.
或 @@SESSION.
)如果存在会话值则返回会话值,否则返回全局值。这与 SET @@
不同,后者始终引用会话值。var_name
= expr