文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (美国信纸) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

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 变量时需要 GLOBAL 关键字,但在检索它们时不需要,原因是为了防止将来出现问题

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

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