MySQL服务器维护用于配置其操作的系统变量。
系统变量可以具有影响整个服务器操作的全局值,也可以具有影响当前会话的会话值,或者两者兼而有之。
许多系统变量是动态的,可以在运行时使用SET语句进行更改,以影响当前服务器实例的操作。
SET还可以用于将某些全局系统变量持久化到数据目录中的mysqld-auto.cnf文件中,以影响后续启动的服务器操作。
RESET PERSIST从mysqld-auto.cnf中删除持久化设置。
以下讨论描述了持久化系统变量的各个方面:
1 持久化系统变量概述
在运行时持久化全局系统变量的功能使服务器配置能够在服务器启动时持久化。
尽管许多系统变量可以在启动时从my.cnf选项文件 设置,也可以在运行时使用set语句设置 ,但这些配置服务器的方法要么需要登录访问服务器 主机,要么不提供在运行时 或远程持久配置服务器的能力:
修改配置文件需要直接访问该文件,这需要登录MySQL服务器主机。这并不总是方便的。
使用SET GLOBAL修改系统变量 是一种运行时功能 ,可以在本地运行的客户端或远程主机上完成,但更改仅影响当前运行的服务器实例 。这些设置不是持久的 ,不会延续到后续的服务器启动中。
为了增强服务器配置的管理功能,使其超出编辑配置文件 或使用SET GLOBAL 所能实现的范围,MySQL提供了SET语法的变体 ,将系统变量设置持久化到数据目录中名为mysqld-auto.cnf文件的文件中。
示例:
sql
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特权系统控制的。
参见"系统变量权限"。
【MySQL精通之路】系统变量-系统变量权限-CSDN博客
具有足够权限的管理员 可以通过保留系统变量来重新配置服务器,然后通过执行RESTART语句 使服务器立即使用更改后的设置。
持久化设置提供有关错误的即时反馈。手动输入的设置中的错误可能要过很久才能发现。持久化系统变量 的SET语句避免了设置格式错误的可能性,因为存在语法错误的设置不会成功,也不会更改服务器配置。
2.持久化系统变量的语法
这些SET语法选项可用于持久化系统变量:
要将全局系统变量持久化到数据目录中的mysqld-auto.cnf选项文件中,请在变量名之前加上persist关键字或@@persist。
sqlSET PERSIST max_connections = 1000; SET @@PERSIST.max_connections = 1000;
与SET GLOBAL 一样,SET PERSIST 设置全局变量运行时值,但也将变量设置写入mysqld-auto.cnf文件(如果有,则替换任何现有的变量设置)。
要在不设置全局变量运行时值的情况下将全局系统变量持久化到mysqld-auto.cnf文件,请在变量名之前加上persist_ONLY关键字或@@persist_UNLY。合格者
sqlSET PERSIST_ONLY back_log = 1000; SET @@PERSIST_ONLY.back_log = 1000;
与PERSIST一样,PERSIST_ONLY 将变量设置写入mysqld-auto.cnf。
但是,与PERSIST 不同,PERSIST_ONLY不修改全局变量运行时值。
这使得PERSIST_ONLY 适合配置只读系统变量,这些变量只能在服务器启动时设置。
有关SET的更多信息,请参阅
"变量赋值的SET语法"。
这些RESET PERSIST语法选项可用于删除持久化的系统变量:
要从mysqld-auto.cnf中删除所有持久化变量,请使用RESET PERSIST,而不指定任何系统变量:
sqlRESET PERSIST;
要从mysqld-auto.cnf中删除特定的持久化变量,请在语句中命名:
sqlRESET PERSIST system_var_name;
这包括插件系统变量 ,即使当前未安装插件。如果该变量不在文件中,则会发生错误。
要从mysqld-auto.cnf中删除特定的持久化变量,但如果该变量不在文件中,则会产生警告而不是错误,请在前面的语法中添加if EXISTS子句:
sqlRESET PERSIST IF EXISTS system_var_name;
有关RESET PERSIST的更多信息,请参阅
"RESET PERIST声明"。
使用SET将全局系统变量 持久化为DEFAULT值或其字面默认值 ,会为该变量指定其默认值,并将该变量的设置添加到mysqld-auto.cnf 。要从文件中删除变量,请使用RESET PERSIST。
某些系统变量无法持久化。参见"不持久和持久受限系统变量"。
如果在执行SET语句时安装了插件,则插件实现的系统变量可以持久化。如果插件仍在安装,则持久化插件变量的分配将在随后的服务器重新启动时生效。如果不再安装插件,则当服务器读取mysqld-auto.cnf文件时,插件变量不存在。在这种情况下,服务器会在错误日志中写入警告并继续:
currently unknown variable 'var_name' was read from the persisted config file
3.获取有关持久化系统变量的信息
Performance Schema库persisted_variables表 为mysqld-auto.cnf文件提供了一个SQL接口,使其内容能够在运行时使用SELECT语句进行检查。
参见"Performance Schema库persisted_variables表"。
Performance Schema库variables_info表 包含显示最近设置每个系统变量 的时间 和用户的信息。
参见"Performance Schema库variables_info表"。
RESET PERSIST 会影响persisted_variables表 的内容,因为该表的内容与mysqld-auto.cnf文件的内容相对应。
另一方面,由于RESET PERSIST不会更改变量值,因此在服务器重新启动之前,它不会影响variables_info表的内容。
4.mysqld-auto.cnf文件的格式与服务器处理流程
mysqld-auto.cnf文件使用如下JSON格式(为了可读性,稍微重新格式化):
sql
{
"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_slave_updates": {
"Value": "1",
"Metadata": {
"Timestamp": 1519925628441588,
"User": "root",
"Host": "localhost"
}
}
}
}
}
在启动时,服务器在处理所有其他配置文件之后处理mysqld-auto.cnf文件
(请参阅"使用配置文件")。
服务器按如下方式处理文件内容:
如果禁用了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语句执行,而不能手动执行:
删除该文件会导致在下一次服务器启动时丢失所有保留的设置。
(如果您打算在没有这些设置的情况下重新配置服务器,则允许这样做。)
要在不删除文件本身的情况下删除文件中的所有设置,请使用以下语句:
sql
RESET PERSIST;
手动更改文件 可能会导致服务器启动时出现解析错误。
在这种情况下,服务器会报告一个错误并退出。
如果出现此问题,请在禁用persisted_globals_load系统变量 或使用**--no defaults选项**的情况下启动服务器。
或者,删除mysqld-auto.cnf文件 。但是,如前所述,删除此文件会导致丢失所有保留的设置。
5.持久化敏感系统变量
从MySQL 8.0.29开始,MySQL Server能够安全地存储包含私钥 或密码 等敏感数据的持久化系统变量值,并限制对这些值的查看。
目前没有MySQL Server系统变量被标记为敏感,但新功能允许包含敏感数据的系统变量在未来安全地持久化。
升级到MySQL 8.0.29后,mysqld-auto.cnf配置文件的格式保持不变,直到第一次发出SET PERSIST或SET PERSIST-ONLY语句,并且在这一点上它被更改为新的格式,即使所涉及的系统变量不敏感。
在新格式中,旧版本的MySQL Server无法读取选项文件。
注意:
必须在MySQL Server实例上启用keyring组件,以支持持久化系统变量值的安全存储,而不是不支持该功能的keyring插件。
请参阅"MySQL密钥环"。
在mysqld-auto.cnf配置文件 中,敏感系统变量 的名称和值以加密的格式存储,以及生成的用于解密它们的文件密钥。
生成的文件密钥依次使用存储在keyring中的主密钥(persisted_variables_key)进行加密。
当服务器启动时,将解密并使用持久化敏感的系统变量。
默认情况下,如果选项文件中存在加密值,但在启动时无法成功解密,则使用其默认设置。
如果无法解密加密的值,则可配置的最安全的设置(persist_sensitive_variables_in_plaintext)会使服务器停止启动。
系统变量persist_sensitive_variables_in_plaintext 控制是否允许服务器以未加密的格式存储敏感系统变量的值 ,如果在使用SET PERSIST 设置值时不支持keyring组件。
如果加密的值无法解密,它还控制服务器是否可以启动。
默认设置ON在keyring组件支持可用的情况下对值进行加密,如果不支持,则保持未加密的值(并发出警告)。
下次设置任何持久化系统变量时,如果当时支持keyring,则服务器会对任何未加密的敏感系统变量的值进行加密。
ON设置还允许服务器在加密的系统变量值无法解密的情况下启动,在这种情况下会发出警告并使用系统变量的默认值。
在这种情况下,它们的值在被解密之前无法更改。
最安全的设置是OFF表示如果keyring组件支持不可用,敏感的系统变量值将无法持久化。OFF设置还意味着,如果无法解密加密的系统变量值,则服务器不会启动。
SENSITIVE_VARIABLES_OBSERVER权限
允许持有者查看Performance Schema库的
global_variables
session_variables
variables_by_thread
persisted_variables
中敏感系统变量的值,发出SELECT语句返回其值,并在连接的会话跟踪器中跟踪对其的更改。
没有此权限的用户无法查看或跟踪这些系统变量值。
如果为敏感的系统变量发出SET语句,则在将查询记录到常规日志和审核日志之前,会重写查询以将值替换为"<redated>"。即使通过keyring组件的安全存储在服务器实例上不可用,也会发生这种情况。