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_ONLY
不同于PERSIST
,它不修改全局变量的运行时值。这使得PERSIST_ONLY
适合配置只能在服务器启动时设置的只读系统变量。
有关SET
的更多信息,请参阅第 15.7.6.1 节,“SET 语法 for 变量赋值”。
这些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 节,“Nonpersistible and Persist-Restricted System Variables”。
系统变量可以在插件安装时持久化,如果在执行 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.3 具有将持久系统变量值包含敏感数据(如私钥或密码)安全存储的功能,并限制查看这些值。当前没有 MySQL 服务器系统变量被标记为敏感的,但这项功能允许将来将敏感数据包含的系统变量持久安全地存储在 mysqld-auto.cnf
选项文件中。由 MySQL 8.3 创建的 mysqld-auto.cnf
选项文件不能被旧版本的 MySQL 服务器读取。
要支持持久系统变量值的安全存储,MySQL 服务器实例必须启用密钥环组件,而不是密钥环插件,因为它们不支持该功能。请参阅 第 8.4.4 节,“MySQL 密钥环”。
在 mysqld-auto.cnf
选项文件中,敏感系统变量的名称和值将以加密格式存储,连同生成的文件密钥用于解密它们。生成的文件密钥将使用主密钥 (persisted_variables_key
) 加密,该主密钥存储在密钥环中。当服务器启动时,将解密持久敏感系统变量并使用它们。默认情况下,如果选项文件中存在加密值但无法成功解密,则使用默认设置。可选的最安全设置使服务器在无法解密加密值时停止启动。
系统变量 persist_sensitive_variables_in_plaintext
控制服务器是否允许在密钥环组件不可用时将敏感系统变量的值存储在明文格式中。它还控制服务器是否可以在无法解密加密值时启动。
-
默认设置为
ON
,如果密钥环组件可用,则加密值,否则以明文格式存储(并发出警告)。下次设置任何持久系统变量时,如果密钥环支持可用,则服务器将加密任何未加密的敏感系统变量的值。ON
设置还允许服务器在无法解密加密值时启动,在这种情况下,将发出警告,并使用默认值。 -
最安全的设置为
OFF
,这意味着如果密钥环组件不可用,则敏感系统变量值不能被持久化。OFF
设置还意味着服务器在无法解密加密值时不会启动。
特权 SENSITIVE_VARIABLES_OBSERVER
允许持有者查看性能模式表 global_variables
、session_variables
、variables_by_thread
和 persisted_variables
中的敏感系统变量值,发出 SELECT
语句以返回这些值,并在会话跟踪器中跟踪这些变量的更改。没有该特权的用户无法查看或跟踪这些系统变量值。
如果发出针对敏感系统变量的 SET
语句,查询将被重写,以便在将其记录到一般日志和审核日志之前,将值替换为 “<已编辑>
”。这即使服务器实例上不可用安全存储通过密钥环组件也适用。