MySQL 服务器维护许多系统变量,以配置其操作。第 7.1.8 节,“服务器系统变量”,描述了这些变量的含义。每个系统变量都有一个默认值。系统变量可以在服务器启动时使用命令行选项或选项文件设置。大多数变量可以在服务器运行时使用 SET
语句动态修改,不需要停止和重新启动服务器。你也可以在表达式中使用系统变量值。
许多系统变量是内置的。系统变量也可以由服务器插件或组件安装:
-
由服务器插件实现的系统变量在插件安装时暴露出来,并且名称以插件名称开头。例如,
audit_log
插件实现了一个名为audit_log_policy
的系统变量。 -
由组件实现的系统变量在组件安装时暴露出来,并且名称以组件特定的前缀开头。例如,
log_filter_dragnet
错误日志过滤器组件实现了一个名为log_error_filter_rules
的系统变量,全名为dragnet.log_error_filter_rules
。要引用这个变量,使用全名。
系统变量存在两个范围。全局变量影响服务器的整体操作。会话变量影响服务器对个别客户端连接的操作。一个系统变量可以同时具有全局和会话值。全局和会话系统变量之间的关系如下:
-
当服务器启动时,它将每个全局变量初始化为其默认值。这些默认值可以通过命令行选项或选项文件中的选项更改。(见 第 6.2.2 节,“指定程序选项”。)
-
服务器还维护每个客户端连接的会话变量集。当客户端连接时,会话变量将使用当前的全局变量值初始化。例如,客户端的 SQL 模式由会话
sql_mode
值控制,该值是在客户端连接时从全局sql_mode
值初始化的。对于一些系统变量,会话值不是从相应的全局值初始化的;如果是这样,那么在变量描述中将指出。
系统变量值可以在服务器启动时使用命令行选项或选项文件全局设置。在启动时,系统变量的语法与命令选项相同,因此在变量名称中,破折号和下划线可以互换使用。例如,--general_log=ON
和 --general-log=ON
是等效的。
当您使用启动选项设置一个数值变量时,可以使用后缀 K
、M
、G
、T
、P
或 E
(无论大小写)来表示乘数1024、10242、10243、10244、10245 或 10246;即单位为千字节、兆字节、吉字节、太字节、拍字节或埃字节。因此,以下命令以256千字节的排序缓冲区大小和1吉字节的最大数据包大小启动服务器:
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 语法 for Variable Assignment”。有关设置和持久化系统变量的权限要求,请参阅 第 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.1.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
子句,语句将仅显示与模式匹配的变量。要获取特定变量名称,请使用 LIKE
子句,如下所示:
SHOW VARIABLES LIKE 'max_join_size';
SHOW SESSION VARIABLES LIKE 'max_join_size';
要获取名称与模式匹配的变量列表,请使用 %
通配符字符在 LIKE
子句中:
SHOW VARIABLES LIKE '%size%';
SHOW GLOBAL VARIABLES LIKE '%size%';
通配符字符可以在要匹配的模式中的任何位置使用。严格来说,因为 _
是一个通配符,匹配任何单个字符,因此您应该将其转义为 \_
以匹配它字面上。在实践中,这几乎不需要。
对于 SHOW VARIABLES
,如果您不指定 GLOBAL
或 SESSION
,MySQL 将返回 SESSION
值。
要求在设置 GLOBAL
只变量时使用 GLOBAL
关键字,但是在检索它们时不需要这样做,是为了避免将来出现的问题:
-
如果删除了一个名称与
GLOBAL
变量相同的SESSION
变量,具有足够权限修改全局变量的客户端可能会意外地更改GLOBAL
变量,而不是仅仅更改自己的会话中的SESSION
变量。 -
如果添加了一个名称与
GLOBAL
变量相同的SESSION
变量,旨在更改GLOBAL
变量的客户端可能会发现只有自己的SESSION
变量被更改。