7.1.9.3 持久化的系统变量
MySQL 服务器维护系统变量,以配置其操作。系统变量可以具有全局值,影响服务器的整个操作,会话值,影响当前会话,或者两者。许多系统变量是动态的,可以在运行时使用SET
语句来更改当前服务器实例的操作。 SET
也可以用来将某些全局系统变量持久化到 mysqld-auto.cnf
文件中,以影响服务器的操作在后续启动时。 RESET PERSIST
删除了 mysqld-auto.cnf
文件中的持久设置。
以下讨论描述了持久化系统变量的方面:
持久化的系统变量概述
持久化全局系统变量的能力使得服务器配置可以持久化到服务器启动。虽然许多系统变量可以在启动时从 my.cnf
选项文件中设置,或者在运行时使用 SET
语句,但是这两种方法都需要服务器主机的登录访问权限,或者不能提供持久化配置服务器的能力或远程访问:
-
修改选项文件需要直接访问该文件,这需要服务器主机的登录访问权限。这不是总是方便的。
-
使用
SET GLOBAL
修改系统变量是运行时的能力,可以从本地客户端或远程主机运行,但是更改只影响当前运行的服务器实例。设置不持久化,不会在后续服务器启动时生效。
为了超出编辑选项文件或使用代码的服务器配置能力,MySQL 提供了代码的变体,这些变体将系统变量的设置 persisted 到名为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 还提供了代码语句,以从mysqld-auto.cnf文件中删除 persisted 系统变量。
通过 persisted 系统变量进行的服务器配置具有以下特点:
-
persisted 设置是在运行时进行的。
-
persisted 设置是永久的。它们在服务器重启时仍然有效。
-
persisted 设置可以从本地客户端或远程主机连接的客户端进行。这样可以从中央客户端主机远程配置多个 MySQL 服务器。
-
为了 persist 系统变量,您不需要对 MySQL 服务器主机或文件系统拥有登录访问权限或选项文件访问权限。persist 设置的控制是通过 MySQL 权限系统进行的。请参阅第7.1.9.1节,“系统变量权限”。
-
具有足够权限的管理员可以通过 persist 系统变量,然后立即将服务器配置更改为使用更改后的设置,以执行代码语句。
-
persisted 设置提供了即时错误反馈。手动输入的设置可能会在很长时间后才被发现。使用代码语句 persist 系统变量可以避免由于语法错误而导致的设置错误,因为语法错误的设置将不会成功并且不会更改服务器配置。
以下代码语句可用于 persist 系统变量:
-
要将全局系统变量 persisted 到mysqld-auto.cnf选项文件中,该文件位于数据目录中,请在变量名称前添加PERSIST关键字或@@PERSIST.限定符:
SET PERSIST max_connections = 1000; SET @@PERSIST.max_connections = 1000;
像代码语句一样,代码语句将设置全局变量的运行值,但也将变量设置写入mysqld-auto.cnf文件(如果存在变量设置,则将其替换)。
-
要将全局系统变量 persisted 到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_ONLY
不同于PERSIST
,它不会修改全局变量的运行时值。这使得PERSIST_ONLY
适合配置只在服务器启动时可设置的只读系统变量。
关于SET
的更多信息,请见第15.7.6.1节,“SET Syntax for Variable Assignment”。
以下是RESET PERSIST
语句的可选项,可以用来删除持久化的系统变量:
-
要删除
mysqld-auto.cnf
中的所有持久化变量,请使用RESET PERSIST
语句,不指定任何系统变量:RESET PERSIST;
-
要删除特定的持久化变量,请在语句中指定变量的名称:
RESET PERSIST system_var_name;
这包括插件系统变量,即使插件当前未安装。如果变量在文件中不存在,会出现错误。
-
要删除特定的持久化变量,但在变量不存在时产生警告,而不是错误,请在前一个语句中添加
IF EXISTS
子句:RESET PERSIST IF EXISTS system_var_name;
关于RESET PERSIST
的更多信息,请见第15.7.8.7节,“RESET PERSIST Statement”。
使用SET
语句将全局系统变量设置为DEFAULT
或其字面值的默认值将变量设置为其默认值,并将其添加到mysqld-auto.cnf
中。要删除变量,请使用RESET PERSIST
语句。
有一些系统变量不能被持久化。请见第7.1.9.4节,“Nonpersistible and Persist-Restricted System Variables”。
由插件实现的系统变量可以被持久化,如果插件在执行SET
语句时安装。如果插件安装时,持久化的插件变量将在服务器重启时生效。如果插件不再安装,插件变量在服务器读取mysqld-auto.cnf
文件时将不存在。在这种情况下,服务器将在错误日志中写入警告继续执行:
currently unknown variable 'var_name'
was read from the persisted config file
获取关于持久化系统变量的信息
性能_schema persisted_variables
表提供了 SQL 接口,以便在运行时使用SELECT
语句来检查 mysqld-auto.cnf
文件的内容。请参阅第29.12.14.1节,“性能_schema persisted_variables 表”。
性能_schema variables_info
表包含了每个系统变量最后一次被设置的时间和用户信息。请参阅第29.12.14.2节,“性能_schema variables_info 表”。
RESET PERSIST
影响了 persisted_variables
表的内容,因为这两个表的内容对应于 mysqld-auto.cnf
文件的内容。相反,因为RESET PERSIST
不会更改变量值,所以它对 variables_info
表的内容无效,直到服务器重启。
mysqld-auto.cnf
文件使用以下格式(重新格式化以提高可读性):
{
"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
文件应该交给服务器。对文件的操作应该使用SET
和RESET PERSIST
语句,而不是手动编辑:
-
删除文件将导致下一次服务器启动时丢失所有持久设置。如果您的意图是重新配置服务器而不使用这些设置,可以删除文件。要在文件中删除所有设置而不删除文件本身,请使用以下语句:
RESET PERSIST;
-
手动编辑文件可能导致服务器启动时解析错误。在这种情况下,服务器报告错误并退出。如果出现此问题,可以使用
persisted_globals_load
系统变量禁用或使用--no-defaults
选项。Alternatively, remove themysqld-auto.cnf
file. However, as noted previously, removing this file results in a loss of all persisted settings.
MySQL 8.4具有存储持久系统变量值的能力,这些值包含敏感数据,如私钥或密码,并且可以限制查看这些值。当前没有MySQL Server系统变量被标记为敏感,但是这项功能允许将敏感数据包含的系统变量持久化安全地存储在未来。一个由MySQL 8.4创建的mysqld-auto.cnf
选项文件不能被older releases of MySQL Server读取。
在MySQL Server实例上启用keyring组件以支持安全存储持久系统变量值,而不是keyring插件,这些插件不支持该功能。见Section 8.4.4, “The MySQL Keyring”。
在mysqld-auto.cnf
选项文件中,敏感系统变量的名称和值以加密格式存储,along with a generated file key to decrypt them。生成的文件密钥使用master key(persisted_variables_key
)进行加密,该master key存储在keyring中。当服务器启动时,持久敏感系统变量将被解密并使用。默认情况下,如果加密值在选项文件中存在但不能在启动时成功解密,系统将使用默认设置。可选的最安全设置使服务器在加密值不能被解密时退出启动。
系统变量persist_sensitive_variables_in_plaintext
控制服务器是否允许在未使用密钥环组件支持的情况下将敏感系统变量的值存储在未加密的格式中,如果使用SET PERSIST
语句将值设置。它还控制服务器是否可以启动,如果加密值不能被解密。
-
默认设置为
ON
,在密钥环组件支持可用时将值加密,在不可用时将其以警告形式保存下来的。下次设置任何 persisted 系统变量时,如果密钥环支持可用,服务器将加密未加密的敏感系统变量的值。ON
设置还允许服务器在加密系统变量值不能被解密的情况下启动,在这种情况下将发出警告,并使用系统变量的默认值。在这种情况下,不能更改这些变量的值,直到它们可以被解密。 -
最安全的设置为
OFF
,这意味着在密钥环组件不可用时敏感系统变量的值不能被 persisted。OFF
设置还意味着服务器不能启动,如果加密系统变量值不能被解密。
权限SENSITIVE_VARIABLES_OBSERVER
允许持有者查看性能.schema 表global_variables
、session_variables
、variables_by_thread
和persisted_variables
,以便于使用SELECT
语句返回它们的值,并跟踪它们的变化,以便于跟踪连接的会话。没有这个权限的用户不能查看或跟踪这些系统变量的值。
如果对敏感系统变量发出SET
语句,查询将被重写,以将值替换为“<redacted>
”,并将其记录到通用日志和审计日志中。这将在服务器实例上不可用密钥环组件的情况下发生。