文档首页
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.3 持久化系统变量

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

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

持久化系统变量概述

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

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

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

为了增强服务器配置的管理功能,使其超越编辑选项文件或使用 SET GLOBAL 所能实现的功能,MySQL 提供了 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 权限系统进行控制。请参阅 第 7.1.9.1 节 “系统变量权限”

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

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

持久化系统变量的语法

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

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

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

    SET GLOBAL 类似,SET PERSIST 会设置全局变量的运行时值,但也会将变量设置写入 mysqld-auto.cnf 文件(如果存在现有变量设置,则替换它)。

  • 要将全局系统变量持久化到 mysqld-auto.cnf 文件而不设置全局变量运行时值,请在变量名称前面加上 PERSIST_ONLY 关键字或 @@PERSIST_ONLY. 限定符

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

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

有关 SET 的更多信息,请参阅第 15.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 的更多信息,请参阅第 15.7.8.7 节,“RESET PERSIST 语句”

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

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

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

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

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

性能模式 variables_info 表包含的信息显示了每个系统变量最近一次设置的时间和设置的用户。请参阅第 29.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_replica_updates": {
        "Value": "1",
        "Metadata": {
          "Timestamp": 1519925628441588,
          "User": "root",
          "Host": "localhost"
        }
      }
    }
  }
}

在启动时,服务器会在处理所有其他选项文件之后处理 mysqld-auto.cnf 文件(请参阅第 6.2.2.2 节,“使用选项文件”)。服务器按如下方式处理文件内容

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

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

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

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

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

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

持久化敏感系统变量

MySQL 8.4 能够安全地存储包含敏感数据(如私钥或密码)的持久化系统变量值,并限制对这些值的查看。目前没有 MySQL 服务器系统变量被标记为敏感,但此功能允许在将来安全地持久化包含敏感数据的系统变量。由 MySQL 8.4 创建的 mysqld-auto.cnf 选项文件无法被旧版本的 MySQL 服务器读取。

注意

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

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

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

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

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

权限 SENSITIVE_VARIABLES_OBSERVER 允许持有者查看性能模式表 global_variablessession_variablesvariables_by_threadpersisted_variables 中的敏感系统变量的值,发出 SELECT 语句以返回它们的值,并在连接的会话跟踪器中跟踪对它们的更改。没有此权限的用户无法查看或跟踪这些系统变量值。

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