文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  使用系统变量

7.1.9 使用系统变量

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

当您使用启动选项来设置采用数值的变量时,可以使用后缀 KMGTPE(大写或小写)来表示 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

后缀字母的大小写无关紧要;256K256k 是等效的,1G1g 也是如此。

要限制系统变量在运行时使用 SET 语句可以设置的最大值,请在服务器启动时使用 --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 子句,该语句仅显示与模式匹配的变量。要获取特定的变量名称,请使用如下所示的 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-only 变量时需要 GLOBAL 关键字,而检索它们时不需要,这是为了防止将来出现问题。

  • 如果要删除与 GLOBAL 变量同名的 SESSION 变量,则具有足够权限修改全局变量的客户端可能会意外更改 GLOBAL 变量,而不仅仅是其自身会话的 SESSION 变量。

  • 如果要添加与 GLOBAL 变量同名的 SESSION 变量,则打算更改 GLOBAL 变量的客户端可能会发现只有其自身的 SESSION 变量发生了更改。