#### 5.1.9.3 持久化系统变量

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

MySQL 服务器维护配置其操作的系统变量。系统变量可以具有影响整个服务器操作的全局值、影响当前会话的会话值，或两者兼而有之。许多系统变量是动态的，可以在运行时使用[`放`](set-variable.html)语句来影响当前服务器实例的操作。[`放`](set-variable.html)也可以用于将某些全局系统变量持久化到`mysqld-auto.cnf`数据目录中的文件，以影响后续启动的服务器操作。[`重置坚持`](reset-persist.html)从`mysqld-auto.cnf`.

以下讨论描述了持久化系统变量的各个方面：

-   [持久化系统变量概述](persisted-system-variables.html#persisted-system-variables-overview)

-   [持久化系统变量的语法](persisted-system-variables.html#persisted-system-variables-syntax)

-   [获取有关持久系统变量的信息](persisted-system-variables.html#persisted-system-variables-information)

-   [mysqld-auto.cnf 文件的格式和服务器处理](persisted-system-variables.html#persisted-system-variables-file-handling)

##### 持久化系统变量概述

在运行时持久化全局系统变量的能力使服务器配置能够在服务器启动时保持不变。虽然许多系统变量可以在启动时从一个`我的.cnf`选项文件，或在运行时使用[`放`](set-variable.html)声明，那些配置服务器的方法要么需要登录访问服务器主机，要么不提供在运行时或远程持久配置服务器的能力：

-   修改选项文件需要直接访问该文件，这需要登录访问 MySQL 服务器主机。这并不总是很方便。

-   修改系统变量[`设置全球`](set-variable.html)是一种运行时功能，可以从本地运行的客户端或远程主机完成，但更改仅影响当前运行的服务器实例。这些设置不是持久的，不会延续到后续的服务器启动。

    增强服务器配置的管理能力，超出通过编辑选项文件或使用[`设置全球`](set-variable.html), MySQL 提供了[`放`](set-variable.html)将系统变量设置保存到名为的文件的语法`mysqld-auto.cnf`数据目录中的文件。例子：


```
SET PERSIST max_connections = 1000;
SET @@PERSIST.max_connections = 1000;

SET PERSIST_ONLY back_log = 100;
SET @@PERSIST_ONLY.back_log = 100;
```

MySQL 还提供了一个[`重置坚持`](reset-persist.html)删除持久化系统变量的语句`mysqld-auto.cnf`.

通过持久化系统变量执行的服务器配置具有以下特征：

-   持久设置是在运行时进行的。

-   持久设置是永久的。它们适用于服务器重新启动。

-   可以从本地客户端或从远程主机连接的客户端进行持久设置。这为从中央客户端主机远程配置多个 MySQL 服务器提供了便利。

-   要持久化系统变量，您无需拥有对 MySQL 服务器主机的登录访问权限或对选项文件的文件系统访问权限。使用 MySQL 权限系统控制持久设置的能力。看[第 5.1.9.1 节，“系统变量权限”](system-variable-privileges.html).

-   具有足够权限的管理员可以通过持久化系统变量来重新配置服务器，然后通过执行[`重新开始`](restart.html)陈述。

-   持久设置提供有关错误的即时反馈。手动输入的设置中的错误可能要到很久以后才会被发现。[`放`](set-variable.html)保留系统变量的语句避免了格式错误的设置的可能性，因为带有语法错误的设置不会成功并且不会更改服务器配置。

##### 持久化系统变量的语法

这些[`放`](set-variable.html)语法选项可用于持久化系统变量：

-   将全局系统变量持久化到`mysqld-auto.cnf`数据目录中的选项文件，变量名前加`坚持`关键字或`@@坚持。`限定词：

    ```
    SET PERSIST max_connections = 1000;
    SET @@PERSIST.max_connections = 1000;
    ```

    喜欢[`设置全球`](set-variable.html),[`设置坚持`](set-variable.html)设置全局变量运行时值，但也将变量设置写入`mysqld-auto.cnf`文件（如果有，则替换任何现有的变量设置）。

-   将全局系统变量持久化到`mysqld-auto.cnf`没有设置全局变量运行时值的文件，在变量名前面加上`PERSIST_ONLY`关键字或`@@PERSIST_ONLY。`限定词：

    ```
    SET PERSIST_ONLY back_log = 1000;
    SET @@PERSIST_ONLY.back_log = 1000;
    ```

    喜欢`坚持`,`PERSIST_ONLY`将变量设置写入`mysqld-auto.cnf`.然而，不同于`坚持`,`PERSIST_ONLY`不修改全局变量运行时值。这使得`PERSIST_ONLY`适用于配置只能在服务器启动时设置的只读系统变量。

    有关更多信息[`放`](set-variable.html)， 看[第 13.7.6.1 节，“变量赋值的 SET 语法”](set-variable.html).

    这些[`重置坚持`](reset-persist.html)语法选项可用于删除持久的系统变量：

-   删除所有持久变量`mysqld-auto.cnf`， 采用[`重置坚持`](reset-persist.html)不命名任何系统变量：

    ```
    RESET PERSIST;
    ```

-   从`mysqld-auto.cnf`，在语句中命名：

    ```
    RESET PERSIST system_var_name;
    ```

    这包括插件系统变量，即使当前未安装插件。如果文件中不存在该变量，则会发生错误。

-   从`mysqld-auto.cnf`，但如果文件中不存在变量，则生成警告而不是错误，添加`如果存在`前面语法的子句：

    ```
    RESET PERSIST IF EXISTS system_var_name;
    ```

    有关更多信息[`重置坚持`](reset-persist.html)， 看[第 13.7.8.7 节，“RESET PERSIST 语句”](reset-persist.html).

    使用[`放`](set-variable.html)将全局系统变量持久化为`默认`或为其文字默认值分配其默认值，并将变量的设置添加到`mysqld-auto.cnf`.要从文件中删除变量，请使用[`重置坚持`](reset-persist.html).

    某些系统变量无法持久化。看[第 5.1.9.4 节，“不可持久和受限的系统变量”](nonpersistible-system-variables.html).

    插件实现的系统变量如果在[`放`](set-variable.html)语句被执行。如果仍然安装了插件，则持久化插件变量的分配将在后续服务器重新启动时生效。如果不再安装插件，则服务器读取时插件变量不存在`mysqld-auto.cnf`文件。在这种情况下，服务器将警告写入错误日志并继续：


```
currently unknown variable 'var_name'
was read from the persisted config file
```

##### 获取有关持久系统变量的信息

性能模式[`持久变量`](performance-schema-persisted-variables-table.html)表提供了一个 SQL 接口`mysqld-auto.cnf`文件，使其内容能够在运行时使用[`选择`](select.html)陈述。看[第 27.12.14.1 节，“性能模式持续存在\_变量表”](performance-schema-persisted-variables-table.html).

性能模式[`变量信息`](performance-schema-variables-info-table.html)表包含显示每个系统变量最近设置的时间和用户的信息。看[第 27.12.14.2 节，“性能模式变量\_信息表”](performance-schema-variables-info-table.html).

[`重置坚持`](reset-persist.html)影响内容[`持久变量`](performance-schema-persisted-variables-table.html)表，因为表的内容对应于`mysqld-auto.cnf`文件。另一方面，因为[`重置坚持`](reset-persist.html)不改变变量值，它对变量的内容没有影响[`变量信息`](performance-schema-variables-info-table.html)表，直到服务器重新启动。

##### mysqld-auto.cnf 文件的格式和服务器处理

这`mysqld-auto.cnf`文件使用一个`JSON`像这样的格式（为了便于阅读，稍微重新格式化）：

```
{
  "Version": 1,
  "mysql_server": {
    "max_connections": {
      "Value": "152",
      "Metadata": {
        "Timestamp": 1519921341372531,
        "User": "root",
        "Host": "localhost"
      }
    },
    "transaction_isolation": {
      "Value": "READ-COMMITTED",
      "Metadata": {
        "Timestamp": 1519921553880520,
        "User": "root",
        "Host": "localhost"
      }
    },
    "mysql_server_static_options": {
      "innodb_api_enable_mdl": {
        "Value": "0",
        "Metadata": {
          "Timestamp": 1519922873467872,
          "User": "root",
          "Host": "localhost"
        }
      },
      "log_slave_updates": {
        "Value": "1",
        "Metadata": {
          "Timestamp": 1519925628441588,
          "User": "root",
          "Host": "localhost"
        }
      }
    }
  }
}
```

启动时，服务器处理`mysqld-auto.cnf`所有其他选项文件之后的文件（请参阅[第 4.2.2.2 节，“使用选项文件”](option-files.html)）。服务器处理文件内容如下：

-   如果[`persisted_globals_load`](server-system-variables.html#sysvar_persisted_globals_load)系统变量被禁用，服务器忽略`mysqld-auto.cnf`文件。

-   这`“mysql_server_static_options”`部分包含使用持久化的只读变量[`SET PERSIST_ONLY`](set-variable.html).该部分还可能（尽管它的名称）包含某些非只读的动态变量。本节中出现的所有变量都附加到命令行并使用其他命令行选项进行处理。

-   所有剩余的持久化变量都是通过执行等价的[`设置全球`](set-variable.html)稍后声明，就在服务器开始侦听客户端连接之前。因此，这些设置直到启动过程的后期才会生效，这可能不适合某些系统变量。最好将这些变量设置在`我的.cnf`而不是在`mysqld-auto.cnf`.

    的管理`mysqld-auto.cnf`文件应该留给服务器。文件的操作只能使用[`放`](set-variable.html)和[`重置坚持`](reset-persist.html)语句，而不是手动：

-   删除该文件会导致在下一次服务器启动时丢失所有持久设置。（如果您的意图是在没有这些设置的情况下重新配置服务器，这是允许的。）要删除文件中的所有设置而不删除文件本身，请使用以下语句：

    ```
    RESET PERSIST;
    ```

-   手动更改文件可能会导致服务器启动时出现解析错误。在这种情况下，服务器会报错并退出。如果出现此问题，请使用[`persisted_globals_load`](server-system-variables.html#sysvar_persisted_globals_load)系统变量禁用或使用[`--no-defaults`](server-options.html#option_mysqld_no-defaults)选项。或者，删除`mysqld-auto.cnf`文件。但是，如前所述，删除此文件会导致丢失所有持久设置。
