MySQL 服务器维护配置其操作的系统变量。系统变量可以具有影响整个服务器操作的全局值、影响当前会话的会话值,或同时具有两者。许多系统变量是动态的,可以在运行时使用 SET
语句进行更改,以影响当前服务器实例的操作。SET
还可用于将某些全局系统变量持久化到数据目录中的 mysqld-auto.cnf
文件,以影响后续启动时的服务器操作。RESET PERSIST
从 mysqld-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
文件使用如下所示的 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
文件的管理应留给服务器。对文件的操作应仅使用 SET
和 RESET 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_variables
、session_variables
、variables_by_thread
和 persisted_variables
中的敏感系统变量的值,发出 SELECT
语句以返回它们的值,并在连接的会话跟踪器中跟踪对它们的更改。没有此权限的用户无法查看或跟踪这些系统变量值。
如果为敏感系统变量发出了 SET
语句,则在将查询记录到常规日志和审计日志之前,会重写该查询以将其值替换为 “<redacted>
”。即使服务器实例上没有通过密钥环组件进行安全存储,也会发生这种情况。