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


MySQL 9.0 参考手册  /  ...  /  持久化系统变量

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
获取有关持久化系统变量的信息

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

Performance Schema variables_info 表包含的信息显示了每个系统变量最近一次由哪个用户在何时设置。请参阅第 29.12.14.3 节,“Performance Schema 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 9.0 能够安全地存储包含敏感数据(如私钥或密码)的持久化系统变量值,并限制对这些值的查看。目前还没有 MySQL 服务器系统变量被标记为敏感变量,但此功能允许在将来安全地持久化包含敏感数据的系统变量。由 MySQL 9.0 创建的 mysqld-auto.cnf 选项文件无法被旧版本的 MySQL 服务器读取。

注意

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

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

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

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

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

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

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