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
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
文件使用如下所示的 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 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_variables
、session_variables
、variables_by_thread
和 persisted_variables
中的敏感系统变量的值,发出 SELECT
语句以返回它们的值,并在连接的会话跟踪器中跟踪对它们的更改。没有此权限的用户无法查看或跟踪这些系统变量值。
如果为敏感系统变量发出了 SET
语句,则会在将查询记录到常规日志和审计日志之前,重写该查询以将其值替换为 “<redacted>
”。即使服务器实例上没有通过密钥环组件提供的 sécurisé 存储,也会发生这种情况。