Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Using System Variables

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等效。

当使用启动选项设置一个需要数字值的变量时,值可以使用KMGTPE(大小写不敏感)作为乘数,表示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

后缀字母的大小写不重要;256K256k等效,同样1G1g等效。

要限制系统变量在运行时可以设置的最大值,以使用以下形式的选项:--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,如果不指定 GLOBALSESSION,MySQL 将返回 SESSION 值。

需要在设置 GLOBAL 只读变量时使用 GLOBAL 关键字,而不是在检索时是为了防止将来出现问题:

  • 如果会话变量被删除,而该变量的名称与 GLOBAL 变量相同,具有足够权限修改全局变量的客户可能错误地更改 GLOBAL 变量,而不是只更改会话变量的值。

  • 如果添加了一个名为与GLOBAL变量相同的SESSION变量,那么一个想要改变GLOBAL变量的客户端可能只会改变自己的SESSION变量。