Documentation Home

5.1.9.3 持久化系统变量

MySQL 服务器维护配置其操作的系统变量。一个系统变量可以有一个影响整个服务器操作的全局值,一个影响当前会话的会话值,或者两者兼而有之。许多系统变量是动态的,可以在运行时使用 SET 语句更改以影响当前服务器实例的操作。 SET也可以用于将某些全局系统变量持久化到 mysqld-auto.cnf数据目录下的文件中,以影响后续启动的服务器操作。 RESET PERSIST从 中删除持久设置mysqld-auto.cnf

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

持久化系统变量概述

在运行时持久保存全局系统变量的能力使服务器配置能够在服务器启动时持续存在。尽管许多系统变量可以在启动时从my.cnf选项文件设置,或在运行时使用 SET 语句设置,但这些配置服务器的方法要么需要登录访问服务器主机,要么不提供在运行时持久配置服务器的能力或远程:

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

  • 修改系统变量 SET GLOBAL是一种运行时功能,可以从本地运行的客户端或远程主机完成,但更改只会影响当前运行的服务器实例。这些设置不是永久性的,不会延续到后续服务器启动。

SET GLOBAL为了增强服务器配置的管理能力, 使其超出通过编辑选项文件或 SET 使用 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语句,用于从mysqld-auto.cnf.

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

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

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

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

  • 要保留系统变量,您不需要具有对 MySQL 服务器主机的登录访问权限或对选项文件的文件系统访问权限。使用 MySQL 权限系统控制持久设置的能力。请参阅 第 5.1.9.1 节,“系统变量权限”

  • RESTART 具有足够权限的管理员可以通过保留系统变量来重新配置服务器,然后通过执行语句 使服务器立即使用更改的设置。

  • 持久设置提供有关错误的即时反馈。手动输入的设置中的错误可能要到很久以后才会被发现。 SET 保留系统变量的语句避免了格式错误设置的可能性,因为语法错误的设置不会成功并且不会更改服务器配置。

持久化系统变量的语法

这些 SET 语法选项可用于持久化系统变量:

  • 要将全局系统变量持久保存到 mysqld-auto.cnf数据目录中的选项文件,请在变量名称前加上 PERSIST关键字或 @@PERSIST.限定符:

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

    与 一样SET GLOBALSET PERSIST设置全局变量运行时值,但也将变量设置写入 mysqld-auto.cnf文件(如果有,则替换任何现有的变量设置)。

  • 要在不设置全局变量运行时值的情况下将全局系统变量持久保存到 mysqld-auto.cnf文件中,请在变量名前面加上PERSIST_ONLY关键字或 @@PERSIST_ONLY.限定符:

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

    PERSISTPERSIST_ONLY将变量设置写入mysqld-auto.cnf。但是,与 不同的是PERSISTPERSIST_ONLY不会修改全局变量运行时的值。这 PERSIST_ONLY适用于配置只能在服务器启动时设置的只读系统变量。

有关 的更多信息 SET,请参阅第 13.7.6.1 节,“变量赋值的 SET 语法”

这些RESET PERSIST语法选项可用于删除持久化的系统变量:

  • 要从 中删除所有持久变量 mysqld-auto.cnf,请 在RESET PERSIST不命名任何系统变量的情况下使用:

    RESET PERSIST;
  • 要从 中删除特定的持久变量 mysqld-auto.cnf,请在语句中将其命名:

    RESET PERSIST system_var_name;

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

  • 要从 中删除特定的持久变量 mysqld-auto.cnf,但如果该变量不在文件中则产生警告而不是错误,IF EXISTS 请在前面的语法中添加一个子句:

    RESET PERSIST IF EXISTS system_var_name;

有关 的更多信息RESET PERSIST,请参阅第 13.7.8.7 节,“RESET PERSIST 语句”

使用 SET将全局系统变量持久化 DEFAULT为其文字默认值或其文字默认值会为该变量分配其默认值并将该变量的设置添加到mysqld-auto.cnf。要从文件中删除变量,请使用 RESET PERSIST.

某些系统变量无法持久化。请参阅 第 5.1.9.4 节,“不可持久和持久受限的系统变量”

SET 如果在执行语句 时安装了插件,则插件实现的系统变量可以持久化 。如果仍然安装了插件,则持久化插件变量的分配会在随后的服务器重新启动时生效。如果不再安装插件,则服务器读取mysqld-auto.cnf文件时插件变量不存在。在这种情况下,服务器向错误日志写入警告并继续:

currently unknown variable 'var_name'
was read from the persisted config file
获取有关持久化系统变量的信息

Performance Schema persisted_variables表为文件提供了一个 SQL 接口 mysqld-auto.cnf,使其内容能够在运行时使用 SELECT语句进行检查。请参阅 第 27.12.14.1 节,“性能模式 persisted_variables 表”

Performance Schema variables_info表包含显示每个系统变量最近设置的时间和用户的信息。请参阅 第 27.12.14.2 节,“性能模式 variables_info 表”

RESET PERSIST影响表的内容, persisted_variables因为表的内容对应于 mysqld-auto.cnf文件的内容。另一方面,因为RESET PERSIST不改变变量值,所以variables_info在服务器重新启动之前它对表的内容没有影响。

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 节,“使用选项文件”)。服务器按如下方式处理文件内容:

  • 如果 persisted_globals_load 系统变量被禁用,服务器将忽略该 mysqld-auto.cnf文件。

  • "mysql_server_static_options" 部分包含使用持久化的只读变量 SET PERSIST_ONLY。该部分还可能(尽管它的名称)包含某些非只读的动态变量。此部分中存在的所有变量都附加到命令行并使用其他命令行选项进行处理。

  • 所有剩余的持久变量都是通过 SET GLOBAL稍后执行等效语句来设置的,就在服务器开始侦听客户端连接之前。因此,这些设置直到启动过程的后期才会生效,这可能不适合某些系统变量。my.cnf将此类变量设置为 in而不是 in 可能更可取 mysqld-auto.cnf

文件的管理mysqld-auto.cnf应该留给服务器。文件的操作应该只使用 SETRESET PERSIST语句执行,而不是手动执行:

  • 删除该文件会导致在下次服务器启动时丢失所有持久设置。(如果您打算在没有这些设置的情况下重新配置服务器,这是允许的。)要删除文件中的所有设置而不删除文件本身,请使用以下语句:

    RESET PERSIST;
  • 手动更改文件可能会导致服务器启动时出现解析错误。在这种情况下,服务器报错并退出。如果出现此问题,请在 persisted_globals_load 禁用系统变量或使用该 --no-defaults选项的情况下启动服务器。或者,删除该 mysqld-auto.cnf文件。但是,如前所述,删除此文件会导致所有持久设置丢失。

保留敏感的系统变量

从 MySQL 8.0.29 开始,MySQL Server 能够安全地存储包含敏感数据(如私钥或密码)的持久化系统变量值,并限制对这些值的查看。目前没有 MySQL 服务器系统变量被标记为敏感,但新功能允许包含敏感数据的系统变量在未来安全地持久化。升级到 MySQL 8.0.29 后,mysqld-auto.cnf选项文件的格式保持不变,直到第一次 SET PERSISTSET PERSIST ONLY发出语句,此时它被更改为新格式,即使涉及的系统变量不敏感。在新格式中,旧版本的 MySQL 服务器无法读取选项文件。

笔记

必须在 MySQL Server 实例上启用密钥环组件以支持持久化系统变量值的安全存储,而不是不支持该功能的密钥环插件。请参阅第 6.4.4 节,“MySQL 密钥环”

mysqld-auto.cnf选项文件中,敏感系统变量的名称和值以加密格式存储,并生成用于解密它们的文件密钥。persisted_variables_key生成的文件密钥又使用存储在密钥环中的主密钥 ( ) 进行加密。当服务器启动时,持久化的敏感系统变量被解密并使用。默认情况下,如果选项文件中存在加密值但无法在启动时成功解密,则使用它们的默认设置。如果无法解密加密值,则可选的最安全设置会使服务器停止启动。

系统变量 persist_sensitive_variables_in_plaintext 控制是否允许服务器以未加密格式存储敏感系统变量的值,如果密钥环组件支持在 SET PERSIST用于设置值时不可用。如果无法解密加密值,它还控制服务器是否可以启动。

  • 默认设置 ,ON如果密钥环组件支持可用,则对值进行加密,如果不支持,则以未加密的方式(带有警告)持久保存它们。下一次设置任何持久化系统变量时,如果当时密钥环支持可用,服务器将加密任何未加密的敏感系统变量的值。ON如果无法解密加密的系统变量值,该设置还允许服务器启动,在这种情况下会发出警告并使用系统变量的默认值。在那种情况下,它们的值在被解密之前无法更改。

  • 最安全的设置,OFF意味着如果密钥环组件支持不可用,则无法保留敏感的系统变量值。该 OFF设置还意味着如果无法解密加密的系统变量值,则服务器不会启动。

该权限 允许持有者查看 Performance Schema 表、 、 和 SENSITIVE_VARIABLES_OBSERVER 中敏感系统变量的值 ,发出语句以返回它们的值,并在连接的会话跟踪器中跟踪它们的变化。没有此权限的用户无法查看或跟踪这些系统变量值。 global_variablessession_variablesvariables_by_threadpersisted_variablesSELECT

如果SET针对敏感系统变量发出语句,则 在将其记录到通用日志和审计日志之前,将重写查询以用<redacted>”替换该值。即使通过密钥环组件的安全存储在服务器实例上不可用,也会发生这种情况。