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 可以从简单(文字值)到复杂(标量子查询返回的值)。
性能模式 user_variables_by_thread 表包含用户定义变量的信息。见 第 29.12.10 节,“性能模式用户定义变量表”。
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 选项文件来进行持久配置更改,但这更cumbersome,并且手动输入的设置可能不会被发现,直到很久以后。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 节,“Nonpersistible 和 Persist-Restricted System Variables”。
插件实现的系统变量可以持久化,如果插件在执行 SET 语句时安装。持久化插件变量的赋值将在服务器重启时生效,如果插件仍然安装。如果插件不再安装,插件变量将不再存在,当服务器读取 mysqld-auto.cnf 文件时。 在这种情况下,服务器将写入错误日志并继续:
currently unknown variable 'var_name'
was read from the persisted config file
要显示系统变量名称和值:
-
一些性能模式表提供系统变量信息。见 第 29.12.14 节,“Performance Schema System Variable Tables”。
-
性能模式
variables_info表包含信息,显示每个系统变量最近一次被设置的时间和用户。见 第 29.12.14.2 节,“Performance Schema variables_info 表”。 -
性能模式
persisted_variables表提供了对mysqld-auto.cnf文件的 SQL 接口,启用了在运行时使用SELECT语句来检查其内容。见 第 29.12.14.1 节,“Performance Schema persisted_variables 表”。
如果 SET 语句中的任何变量赋值失败,整个语句将失败,且不更改任何变量,也不会更改 mysqld-auto.cnf 文件。
SET 在以下情况下产生错误。 大多数示例显示使用关键字语法(例如 GLOBAL 或 SESSION)的 SET 语句,但这些原则也适用于使用相应修饰符(例如 @@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