7.1.9 使用系统变量
MySQL 服务器维护许多系统变量,以配置其操作。第7.1.8节,“服务器系统变量”描述了这些变量的含义。每个系统变量都有默认值。系统变量可以在服务器启动时使用命令行选项或选项文件设置。绝大多数系统变量可以在服务器运行时动态更改,以使用SET
语句,这使您可以修改服务器的操作而不需要停止和重新启动它。您还可以在表达式中使用系统变量值。
许多系统变量是内置的。系统变量可能还由服务器插件或组件实现:
-
由服务器插件实现的系统变量在插件安装时暴露,并且名称以插件名称开头。例如,
audit_log
插件实现了一个名为audit_log_policy
的系统变量。 -
由组件实现的系统变量在组件安装时暴露,并且名称以组件专用前缀开头。例如,
log_filter_dragnet
错误日志过滤器组件实现了一个名为dragnet.log_error_filter_rules
的系统变量,以便引用该变量,请使用全名。
系统变量存在两个范围。全局变量影响服务器的总体操作。会话变量影响客户端连接的操作。给定系统变量可以同时具有全局和会话值。全局和会话系统变量之间的关系如下:
-
当服务器启动时,它将初始化每个全局变量到其默认值。这些默认值可以通过命令行选项或选项文件更改。 (见第6.2.2节,“Specifying Program Options”。)
-
服务器还维护每个客户端的会话变量。客户端的会话变量在连接时使用当前全局变量的值进行初始化。例如,客户端的SQL模式由会话
sql_mode
值控制,该值在客户端连接时初始化为全局sql_mode
值的当前值。对于一些系统变量,会话值不从对应的全局值初始化;如果是这样,那么在变量描述中将指出。
系统变量的值可以在服务器启动时全局设置,使用命令行选项或选项文件。服务器启动时,系统变量的语法与命令选项相同,因此在变量名中,破折号和下划线可以互换使用。例如,--general_log=ON
和--general-log=ON
等效。
当使用启动选项设置一个需要数字值的变量时,值可以使用K
、M
、G
、T
、P
或E
(大小写不敏感)作为乘数,表示1024的幂次方,即KB、MB、GB、TB、PB或EB。因此,以下命令将服务器启动时将排序缓冲区大小设置为256KB和最大数据包大小为1GB:
mysqld --sort-buffer-size=256K --max-allowed-packet=1G
在选项文件中,设置变量的方式如下:
[mysqld]
sort_buffer_size=256K
max_allowed_packet=1G
后缀字母的大小写不重要;256K
和256k
等效,同样1G
和1g
等效。
要限制系统变量在运行时可以设置的最大值,以使用以下形式的选项:--maximum-
在服务器启动时。例如,要防止var_name
=value
sort_buffer_size
的值在运行时增加到超过32MB,可以使用选项--maximum-sort-buffer-size=32M
。
许多系统变量是动态的,可以在运行时使用SET
语句更改。要查看列表,请参阅第7.1.9.2节,“动态系统变量”。要使用SET
语句更改系统变量,请将其名称写作使用下划线,而不是破折号。以下示例简要说明了这种语法:
-
设置全局系统变量:
SET GLOBAL max_connections = 1000; SET @@GLOBAL.max_connections = 1000;
-
将全局系统变量持久化到
mysqld-auto.cnf
文件(并设置运行时值):SET PERSIST max_connections = 1000; SET @@PERSIST.max_connections = 1000;
-
将全局系统变量持久化到
mysqld-auto.cnf
文件(不设置运行时值):SET PERSIST_ONLY back_log = 1000; SET @@PERSIST_ONLY.back_log = 1000;
-
设置会话系统变量:
SET SESSION sql_mode = 'TRADITIONAL'; SET @@SESSION.sql_mode = 'TRADITIONAL'; SET @@sql_mode = 'TRADITIONAL';
关于SET
语法的详细信息,请见第15.7.6.1节,“SET 语法 для变量分配”。关于设置和持久化系统变量的权限要求,请见第7.1.9.1节,“系统变量权限”
在设置变量时,可以使用乘数后缀,但是不能使用SET
在运行时设置变量。使用SET
可以将变量的值使用表达式,这在服务器启动时设置变量时不成立。例如,以下行在服务器启动时是合法的,但是第二行不是:
$> mysql --max_allowed_packet=16M
$> mysql --max_allowed_packet=16*1024*1024
相反,第二行在运行时是合法的,但是第一行不是:
mysql> SET GLOBAL max_allowed_packet=16M;
mysql> SET GLOBAL max_allowed_packet=16*1024*1024;
要显示系统变量的名称和值,请使用SHOW VARIABLES
语句:
mysql> SHOW VARIABLES;
+-------------------------------------------------------+----------------------+
| Variable_name | Value |
+-------------------------------------------------------+----------------------+
| activate_all_roles_on_login | OFF |
| admin_address | |
| admin_port | 33062 |
| admin_ssl_ca | |
| admin_ssl_capath | |
| admin_ssl_cert | |
| admin_ssl_cipher | |
| admin_ssl_crl | |
| admin_ssl_crlpath | |
| admin_ssl_key | |
| admin_tls_ciphersuites | |
| admin_tls_version | TLSv1.2,TLSv1.3 |
| authentication_policy | *,, |
| auto_generate_certs | ON |
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
| autocommit | ON |
| automatic_sp_privileges | ON |
...
| version | 8.4.0 |
| version_comment | Source distribution |
| version_compile_machine | x86_64 |
| version_compile_os | Linux |
| version_compile_zlib | 1.2.13 |
| wait_timeout | 28800 |
| warning_count | 0 |
| windowing_use_high_precision | ON |
| xa_detach_on_prepare | ON |
+-------------------------------------------------------+----------------------+
使用LIKE
take clause,语句只显示与模式匹配的变量。要获取特定的变量名称,请使用LIKE
take clause,如下所示:
SHOW VARIABLES LIKE 'max_join_size';
SHOW SESSION VARIABLES LIKE 'max_join_size';
要获取变量名匹配模式的列表,请使用LIKE
take clause:
SHOW VARIABLES LIKE '%size%';
SHOW GLOBAL VARIABLES LIKE '%size%';
通配符可以在模式中任何位置使用。严格来说,因为 _
是通配符,可以匹配任何单个字符,因此应该将其转义为 \_
以匹配它。实际上,这很少需要。
对于SHOW VARIABLES
,如果不指定 GLOBAL
或 SESSION
,MySQL 将返回 SESSION
值。
需要在设置 GLOBAL
只读变量时使用 GLOBAL
关键字,而不是在检索时是为了防止将来出现问题:
-
如果会话变量被删除,而该变量的名称与
GLOBAL
变量相同,具有足够权限修改全局变量的客户可能错误地更改GLOBAL
变量,而不是只更改会话变量的值。 -
如果添加了一个名为与
GLOBAL
变量相同的SESSION
变量,那么一个想要改变GLOBAL
变量的客户端可能只会改变自己的SESSION
变量。