### 5.1.9使用系统变量

[5.1.9.1系统变量权限](system-variable-privileges.html)
[5.1.9.2动态系统变量](dynamic-system-variables.html)
[5.1.9.3持久化系统变量](persisted-system-variables.html)
[5.1.9.4不可逆和持续受限系统变量](nonpersistible-system-variables.html)
[5.1.9.5结构化系统变量](structured-system-variables.html)

[](<>)[](<>)[](<>)[](<>)

MySQL服务器维护许多配置其操作的系统变量。[第5.1.8节“服务器系统变量”](server-system-variables.html)，描述了这些变量的含义。每个系统变量都有一个默认值。可以在服务器启动时使用命令行或选项文件中的选项设置系统变量。在服务器运行时，可以通过[`设置`](set-variable.html)语句，它使您可以修改服务器的操作，而无需停止并重新启动服务器。也可以在表达式中使用系统变量值。

许多系统变量是内置的。系统变量也可以通过服务器插件或组件安装：

-   服务器插件实现的系统变量在插件安装时公开，并且其名称以插件名称开头。例如`审计日志`插件实现了一个名为[`审核日志策略`](audit-log-reference.html#sysvar_audit_log_policy).

-   组件实现的系统变量在安装组件时公开，并且其名称以特定于组件的前缀开头。例如`原木过滤网`错误日志筛选器组件实现了一个名为`日志错误过滤规则`，其全名为[`拉网。日志错误过滤规则`](server-system-variables.html#sysvar_dragnet.log_error_filter_rules).要引用此变量，请使用全名。

    系统变量存在两个作用域。全局变量影响服务器的整体操作。会话变量会影响单个客户端连接的操作。给定的系统变量可以同时具有全局值和会话值。全局和会话系统变量的关联如下：

-   服务器启动时，会将每个全局变量初始化为其默认值。可以通过命令行或选项文件中指定的选项更改这些默认值。（见[第4.2.2节“指定程序选项”](program-options.html).)

-   服务器还为每个连接的客户端维护一组会话变量。客户端的会话变量在连接时使用相应全局变量的当前值进行初始化。例如，一个客户端的 SQL 模式是由 session 控制的[`sql_mode`](server-system-variables.html#sysvar_sql_mode)value，当客户端连接到全局的值时初始化[`sql_mode`](server-system-variables.html#sysvar_sql_mode)价值。

    对于某些系统变量，会话值不是从对应的全局值初始化的；如果是这样，则在变量描述中指出。

    可以在服务器启动时使用命令行或选项文件中的选项全局设置系统变量值。在启动时，系统变量的语法与命令选项的语法相同，因此在变量名中，破折号和下划线可以互换使用。例如，[`--general_log=ON`](server-system-variables.html#sysvar_general_log)和[`--general-log=ON`](server-system-variables.html#sysvar_general_log)是等价的。

    当您使用启动选项设置一个采用数值的变量时，该值可以带有后缀`ķ`,`米`， 要么`G`（大写或小写）表示1024的乘数，1024<sup>2</sup>或 1024<sup>3</sup>;也就是说，分别以千字节、兆字节或千兆字节为单位。从 MySQL 8.0.14 开始，后缀也可以是`吨`,`磷`， 和`乙`表示 1024 的乘数<sup>4</sup>, 1024<sup>5</sup>或 1024<sup>6</sup>.因此，以下命令使用以下命令启动服务器`InnoDB`日志文件大小为 16 MB，最大数据包大小为 1 GB：


```
mysqld --innodb-log-file-size=16M --max-allowed-packet=1G
```

在选项文件中，这些变量的设置如下：

```
[mysqld]
innodb_log_file_size=16M
max_allowed_packet=1G
```

后缀字母的字母大小写无关紧要；`16M`和`16m`是等价的`1G`和`1克`.

限制系统变量在运行时可以设置的最大值[`放`](set-variable.html)语句，通过使用形式的选项指定此最大值`- 最大-*`变量名`*=*`价值`*`在服务器启动时。例如，为了防止[`innodb_log_file_size`](innodb-parameters.html#sysvar_innodb_log_file_size)从运行时增加到超过 32MB，使用该选项`--maximum-innodb-log-file-size=32M`.

许多系统变量是动态的，可以在运行时通过使用[`放`](set-variable.html)陈述。有关列表，请参阅[第 5.1.9.2 节，“动态系统变量”](dynamic-system-variables.html).更改系统变量[`放`](set-variable.html), 按名称引用它，可选地在前面加上修饰符。在运行时，系统变量名称必须使用下划线而非破折号书写。以下示例简要说明了此语法：

-   设置全局系统变量：

    ```
    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-variable.html)语法，见[第 13.7.6.1 节，“变量赋值的 SET 语法”](set-variable.html).有关设置和持久化系统变量的权限要求的描述，请参阅[第 5.1.9.1 节，“系统变量权限”](system-variable-privileges.html)

    在服务器启动时设置变量时可以使用指定值乘数的后缀，但不能使用[`放`](set-variable.html)在运行时。另一方面，与[`放`](set-variable.html)您可以使用表达式分配变量的值，当您在服务器启动时设置变量时，这是不正确的。例如，以下第一行在服务器启动时是合法的，但第二行不合法：


```
$> 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.html)陈述：

```
mysql> SHOW VARIABLES;
+---------------------------------+-----------------------------------+
| Variable_name                   | Value                             |
+---------------------------------+-----------------------------------+
| auto_increment_increment        | 1                                 |
| auto_increment_offset           | 1                                 |
| automatic_sp_privileges         | ON                                |
| back_log                        | 151                               |
| basedir                         | /home/mysql/                      |
| binlog_cache_size               | 32768                             |
| bulk_insert_buffer_size         | 8388608                           |
| character_set_client            | utf8                              |
| character_set_connection        | utf8                              |
| character_set_database          | utf8mb4                           |
| character_set_filesystem        | binary                            |
| character_set_results           | utf8                              |
| character_set_server            | utf8mb4                           |
| character_set_system            | utf8                              |
| character_sets_dir              | /home/mysql/share/mysql/charsets/ |
| collation_connection            | utf8_general_ci                   |
| collation_database              | utf8mb4_0900_ai_ci                |
| collation_server                | utf8mb4_0900_ai_ci                |
...
| innodb_autoextend_increment     | 8                                 |
| innodb_buffer_pool_size         | 8388608                           |
| innodb_commit_concurrency       | 0                                 |
| innodb_concurrency_tickets      | 500                               |
| innodb_data_file_path           | ibdata1:10M:autoextend            |
| innodb_data_home_dir            |                                   |
...
| version                         | 8.0.1-dmr-log                     |
| version_comment                 | Source distribution               |
| version_compile_machine         | i686                              |
| version_compile_os              | suse-linux                        |
| wait_timeout                    | 28800                             |
+---------------------------------+-----------------------------------+
```

带一个[`喜欢`](string-comparison-functions.html#operator_like)子句，该语句仅显示与模式匹配的那些变量。要获取特定的变量名，请使用[`喜欢`](string-comparison-functions.html#operator_like)子句如图：

```
SHOW VARIABLES LIKE 'max_join_size';
SHOW SESSION VARIABLES LIKE 'max_join_size';
```

要获取名称与模式匹配的变量列表，请使用`%`a中的通配符[`喜欢`](string-comparison-functions.html#operator_like)条款：

```
SHOW VARIABLES LIKE '%size%';
SHOW GLOBAL VARIABLES LIKE '%size%';
```

通配符可用于要匹配的模式中的任何位置。严格来说，因为`_`是匹配任何单个字符的通配符，您应该将其转义为`\_`从字面上匹配它。在实践中，这很少是必要的。

为了[`显示变量`](show-variables.html), 如果您都不指定`全球的`也不`会议`, MySQL 返回`会议`价值观。

要求的原因`全球的`设置时的关键字`全球的`-only 变量而不是在检索它们时是为了防止将来出现问题：

-   是一个`会议`要删除的与 a 同名的变量`全球的`变量，具有足以修改全局变量的权限的客户端可能会意外更改`全球的`变量而不仅仅是`会议`它自己的会话的变量。

-   是一个`会议`要添加的变量与 a 同名`全球的`变量，一个打算改变`全球的`变量可能只找到它自己的`会议`变量变了。
