使用MySQL服务器系统变量
MySQL服务器维护许多配置其操作的系统变量。“服务器系统变量”描述了这些变量的含义。每个系统变量都有一个默认值。可以在服务器启动时使用命令行或选项文件中的选项设置系统变量。可以通过以下SET
语句在服务器运行时动态更改其中的大多数内容,该语句使您无需停止并重新启动服务器即可修改服务器的操作。您也可以在表达式中使用系统变量值。
内置了许多系统变量。服务器插件或组件也可以安装系统变量:
- 服务器插件实现的系统变量在安装插件时公开,并且其名称以插件名称开头。例如,该
udit_log
插件实现了名为的系统变量udit_log_policy
。 - 由服务器组件实现的系统变量在安装组件时公开,并且其名称以特定于组件的前缀开头。例如,
log_filter_dragnet
错误日志过滤器组件实现了名为的系统变量log_error_filter_rules
,其全名是dragnet.log_error_filter_rules
。要引用此变量,请使用全名。
系统变量存在两个范围。全局变量会影响服务器的整体操作。会话变量会影响单个客户端连接的操作。给定的系统变量可以具有全局值和会话值。全局和会话系统变量之间的关系如下:
- 服务器启动时,它将每个全局变量初始化为其默认值。这些默认值可以通过命令行或选项文件中指定的选项来更改。(请参见“指定程序选项”。)
服务器还为每个连接的客户端维护一组会话变量。客户端的会话变量在连接时使用相应全局变量的当前值进行初始化。例如,客户端的SQL模式由会话
sql_mode
值控制,该会话值在客户端连接到全局sql_mode
值的值时初始化。对于某些系统变量,不会从相应的全局值初始化会话值;如果是这样,则在变量描述中指出。
可以在服务器启动时通过使用命令行或选项文件中的选项来全局设置系统变量值。启动时,系统变量的语法与命令选项的语法相同,因此在变量名称中,破折号和下划线可以互换使用。例如,--general_log=ON
和--general-log=ON
是等效的。
当使用启动选项设置一个变量,需要一个数字值,该值可以与一个后缀被给予K
,M
或G
(大写或小写),以指示1024一乘法器,1024 2或1024 3 ;也就是说,分别以千字节,兆字节或千兆字节为单位。从MySQL 8.0.14的,后缀也可以是T
,P
和E
以指示1024乘法器4,1024 5 或1024 6。因此,以下命令将以InnoDB
16兆字节的日志文件大小和1 GB的最大数据包大小启动服务器:
mysqld --innodb-log-file-size=16M --max-allowed-packet=1G
在选项文件中,这些变量的设置如下:
[mysqld] innodb_log_file_size=16M max_allowed_packet=1G
后缀字母的字母大小写无关紧要;16M
和16m
等价,与1G
和等价1g
。
要使用该SET
语句限制可以在运行时将系统变量设置为的最大值,请在服务器启动时使用格式的选项来指定此最大值。例如,要防止在运行时将的值增加到32MB以上,请使用选项。--maximum-var_name=value
innodb_log_file_size
--maximum-innodb-log-file-size=32M
许多系统变量都是动态的,可以在运行时通过使用SET
语句来更改。有关列表,请参见“动态系统变量”。要使用更改系统变量SET
,请使用名称来引用它,还可以在其前面加上修饰符。在运行时,必须使用下划线而不是破折号来写系统变量名称。以下示例简要说明了此语法:
设置全局系统变量:
SET GLOBAL max_connections = 1000;SET @@GLOBAL.max_connections = 1000;将全局系统变量持久化到
mysqld-auto.cnf
文件(并设置运行时值):SET PERSIST max_connections = 1000;SET @@PERSIST.max_connections = 1000;将全局系统变量持久化到
mysqld-auto.cnf
文件(不设置运行时值):SET PERSIST_ONLY back_log = 1000;SET @@PERSIST_ONLY.back_log = 1000;设置会话系统变量:
SET SESSION sql_mode = 'TRADITIONAL';SET @@SESSION.sql_mode = 'TRADITIONAL';SET @@sql_mode = 'TRADITIONAL';
有关SET
语法的完整详细信息,请参见“变量分配的SET语法”。有关设置和保留系统变量的特权要求的说明,请参见“系统变量特权”
在服务器启动时设置变量时可以使用用于指定值乘数的后缀,但SET
在运行时不能使用后缀来设置值。另一方面,使用SET
可以使用表达式分配变量的值,而在服务器启动时设置变量时则不正确。例如,以下第一行在服务器启动时是合法的,但第二行不是:
shell>mysql --max_allowed_packet=16M shell>mysql --max_allowed_packet=16*1024*1024
相反,以下第二行在运行时是合法的,但第一行则不是:
mysql>SET GLOBAL max_allowed_packet=16M; mysql>SET GLOBAL max_allowed_packet=16*1024*1024;
注意可以通过将
SET
语句设置为ON
或来启用某些系统变量1
,或者通过将其设置为OFF
或来禁用某些系统变量0
。但是,要在命令行或选项文件中设置此类变量,必须将其设置为1
或0
。将其设置为ON
或OFF
将不起作用。例如,在命令行上有效,--delay_key_write=1
但--delay_key_write=ON
无效。
要显示系统变量名称和值,请使用以下SHOW VARIABLES
语句:
mysql>SHOW VARIABLES ; +--------------------------------- +----------------------------------- + | Variable_name | Value | +--------------------------------- +----------------------------------- + | auto_increment_increment | 1 | | auto_increment_offset | 1 | | automatic_sp_privileges | ON | | back_log | 151 | | basedir | /home/mysql/ | | binlog_cache_size | 32768 | | bulk_insert_buffer_size | 8388608 | | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | /home/mysql/share/mysql/charsets/ | | collation_connection | utf8_general_ci | | collation_database | utf8mb4_0900_ai_ci | | collation_server | utf8mb4_0900_ai_ci | ... | innodb_autoextend_increment | 8 | | innodb_buffer_pool_size | 8388608 | | innodb_commit_concurrency | 0 | | innodb_concurrency_tickets | 500 | | innodb_data_file_path | ibdata1:10M:autoextend | | innodb_data_home_dir | | ... | version | 8.0.1 -dmr -log | | version_comment | Source distribution | | version_compile_machine | i686 | | version_compile_os | suse -linux | | wait_timeout | 28800 | +--------------------------------- +----------------------------------- +
使用LIKE
子句,该语句仅显示与模式匹配的那些变量。要获取特定的变量名,请使用LIKE
如下所示的子句:
SHOW VARIABLES LIKE 'max_join_size';SHOW SESSION VARIABLES LIKE 'max_join_size';
要获取名称与模式匹配的变量列表,请%
在LIKE
子句中使用通配符:
SHOW VARIABLES LIKE '%size%';SHOW GLOBAL VARIABLES LIKE '%size%';
通配符可以在要匹配的模式中的任何位置使用。严格来说,因为_
是一个与任何单个字符匹配的通配符,所以您应该对其进行转义\_
以使其在字面上匹配。实际上,这几乎没有必要。
对于SHOW VARIABLES
,如果您既不指定GLOBAL
也不指定SESSION
,则MySQL返回SESSION
值。
GLOBAL
在设置GLOBAL
仅变量时而不是在检索变量时要求关键字的原因是为了防止将来出现问题:
- 如果
SESSION
要删除的变量与变量具有相同的名称GLOBAL
,则具有足以修改全局变量的特权的客户端可能会意外更改该GLOBAL
变量,而不仅仅是SESSION
为自己的会话更改该变量。 - 如果
SESSION
要添加与变量同名的GLOBAL
变量,则打算更改该GLOBAL
变量的客户端可能只会发现自己的SESSION
变量已更改。
系统变量特权
系统变量可以具有一个全局值,该全局值会影响整个服务器的运行,一个会话值仅影响当前会话,或者同时具有这两个值:
- 对于动态系统变量,该
SET
语句可用于更改其全局或会话运行时值(或两者),以影响当前服务器实例的操作。(有关动态变量的信息,请参见“动态系统变量”。) - 对于某些全局系统变量,
SET
可用于将其值持久保存到mysqld-auto.cnf
数据目录中的文件中,以影响后续启动时服务器的操作。(有关持久化系统变量和mysqld-auto.cnf
文件的信息,请参见“持久性系统变量”。) - 对于持久的全局系统变量,
RESET PERSIST
可用于从中删除它们的值mysqld-auto.cnf
,以影响后续启动时服务器的操作。
本节介绍在运行时将值分配给系统变量的操作所需的特权。这包括影响运行时值的操作以及保持值的操作。
要设置全局系统变量,请使用SET
带有适当关键字的语句。这些特权适用:
- 要设置全局系统变量运行时值,请使用
SET GLOBAL
需要SYSTEM_VARIABLES_ADMIN
或SUPER
特权的语句。 - 要将全局系统变量持久化到
mysqld-auto.cnf
文件中(并设置运行时值),请使用SET PERSIST
需要SYSTEM_VARIABLES_ADMIN
orSUPER
特权的语句。 - 要将全局系统变量持久化到
mysqld-auto.cnf
文件(不设置运行时值),请使用SET PERSIST_ONLY
需要SYSTEM_VARIABLES_ADMIN
和PERSIST_RO_VARIABLES_ADMIN
特权的语句。SET PERSIST_ONLY
可以同时用于动态和只读系统变量,但是对于持久化SET PERSIST
无法使用的只读变量特别有用。 - 一些全局系统变量是持久限制的(请)。要保留这些变量,请使用该
SET PERSIST_ONLY
语句,该语句需要前面所述的特权。此外,您必须使用加密连接连接到服务器,并提供SSL证书,其SSL证书的主题值由persist_only_admin_x509_subject
系统变量指定。
要从文件中删除持久化的全局系统变量mysqld-auto.cnf
,请使用以下RESET PERSIST
语句。这些特权适用:
- 对于动态系统变量,
RESET PERSIST
需要SYSTEM_VARIABLES_ADMIN
或SUPER
特权。 - 对于只读系统变量,
RESET PERSIST
需要SYSTEM_VARIABLES_ADMIN
和PERSIST_RO_VARIABLES_ADMIN
特权。 - 对于持久限制变量,
RESET PERSIST
不需要使用特定SSL证书建立的到服务器的加密连接。
如果全局系统变量具有上述特权要求的任何例外,则变量描述会指示这些例外。示例包括default_table_encryption
和mandatory_roles
,它们需要其他特权。这些附加特权适用于设置全局运行时值的操作,但不适用于保留该值的操作。
要设置会话系统变量运行时值,请使用以下SET SESSION
语句。与设置全局运行时值相反,设置会话运行时值通常不需要特殊特权,并且任何用户都可以完成以影响当前会话。对于某些系统变量,设置会话值可能会在当前会话之外产生影响,因此是受限制的操作,只有具有特殊特权的用户才能执行此操作:
从MySQL 8.0.14开始,所需的特权是
SESSION_VARIABLES_ADMIN
。注意
暗含
SYSTEM_VARIABLES_ADMIN
或SUPER
有效拥有SESSION_VARIABLES_ADMIN
的任何用户都不需要SESSION_VARIABLES_ADMIN
明确授予。- 在MySQL 8.0.14之前,所需的特权为
SYSTEM_VARIABLES_ADMIN
或SUPER
。
如果会话系统变量受限制,则变量描述指示该限制。示例包括binlog_format
和sql_log_bin
。设置这些变量的会话值会影响当前会话的二进制日志记录,但也可能对服务器复制和备份的完整性产生更广泛的影响。
SESSION_VARIABLES_ADMIN
使管理员能够最大程度地减少以前可能已被授予权限的用户的权限,SYSTEM_VARIABLES_ADMIN
或者SUPER
使他们能够修改受限会话系统变量。假设管理员创建了以下角色,以赋予设置受限会话系统变量的能力:
CREATE ROLE set_session_sysvars;GRANT SYSTEM_VARIABLES_ADMINON *.*TO set_session_sysvars;
任何被授予set_session_sysvars
角色的用户(并且具有该角色的角色)都可以设置受限的会话系统变量。但是,该用户也能够设置全局系统变量,这可能是不希望的。
通过将角色修改为具有SESSION_VARIABLES_ADMIN
而不是SYSTEM_VARIABLES_ADMIN
,可以将角色特权降低为设置受限会话系统变量的能力,而没有其他设置。要修改角色,请使用以下语句:
GRANT SESSION_VARIABLES_ADMINON *.*TO set_session_sysvars;REVOKE SYSTEM_VARIABLES_ADMINON *.*FROM set_session_sysvars;
修改角色具有立竿见影的效果:被授予set_session_sysvars
角色的任何帐户在没有SYSTEM_VARIABLES_ADMIN
明确授予该功能的情况下,将不再具有并且不能设置全局系统变量。可以将类似的GRANT
/REVOKE
序列应用于SYSTEM_VARIABLES_ADMIN
直接授予的任何帐户,而不是通过角色进行的帐户。
动态系统变量
许多服务器系统变量是动态的,可以在运行时设置。请参见“变量分配的SET语法”。有关设置系统变量的特权要求的说明,请参见“系统变量特权”
下表列出了适用于的所有动态系统变量mysqld
。
该表列出了每个变量的数据类型和范围。最后一列指示每个变量的作用域是全局变量,会话变量还是两者。有关设置和使用变量的详细信息,请参见相应的项目描述。在适当的地方,提供了指向有关该项目的更多信息的直接链接。
类型为“ string ”的变量采用字符串值。类型为“ numeric ”的变量采用数字值。可以将类型为“ boolean ”的变量设置为0、1 ON
或OFF
。标记为“枚举”的变量通常应设置为该变量的可用值之一,但也可以设置为与所需枚举值相对应的数字。对于枚举的系统变量,第一个枚举值对应于0。这与ENUM
用于表列的数据类型,其第一个枚举值对应于1。
持久性系统变量
MySQL服务器维护配置其操作的系统变量。系统变量可以具有影响整个服务器操作的全局值,影响当前会话的会话值或两者。许多系统变量是动态的,可以在运行时使用该SET
语句更改以影响当前服务器实例的操作。SET
也可以用于将某些全局系统变量持久保存到mysqld-auto.cnf
数据目录中的文件中,以影响后续启动时服务器的操作。RESET PERSIST
从中删除保留的设置mysqld-auto.cnf
。
以下讨论描述了持久化系统变量的方面:
- 持久性系统变量概述
- 持久化系统变量的语法
- 获取有关持久性系统变量的信息
- mysqld-auto.cnf文件的格式和服务器处理
持久性系统变量概述
在运行时持久保存全局系统变量的功能使服务器配置可以在服务器启动期间持久保存。尽管可以在启动时从my.cnf
选项文件中设置许多系统变量,或者使用以下SET
语句在运行时进行设置,但是那些配置服务器的方法要么要求登录到服务器主机,要么不提供在运行时持久配置服务器的能力。远程:
- 修改选项文件需要直接访问该文件,而该文件需要具有对MySQL服务器主机的登录访问权限。这并不总是很方便。
- 使用修改系统变量
SET GLOBAL
是一种运行时功能,可以从本地运行的客户端或远程主机运行,但是更改仅影响当前正在运行的服务器实例。这些设置不是永久性的,不会延续到后续的服务器启动中。
为了增强服务器配置的管理功能,超出通过编辑选项文件或使用所能实现的功能SET GLOBAL
,MySQL提供了一些SET
语法变体,可将系统变量设置保留到mysqld-auto.cnf
数据目录中名为 file的文件中。例子:
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特权系统控制的。请参见“系统变量特权”。
- 具有足够特权的管理员可以通过保留系统变量来重新配置服务器,然后通过执行一条
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
,请参见“变量分配的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
,请参见“ RESET PERSIST语句”。
使用SET
一个全局系统变量坚持到的值DEFAULT
或者它的字面默认值赋给变量的默认值,并增加了一个设定的变量mysqld-auto.cnf
。要从文件中删除变量,请使用RESET PERSIST
。
某些系统变量无法持久保存。请参见“非持久性和持久性限制的系统变量”。
如果在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
语句检查其内容。请参见“性能模式persisted_variables表”。
“性能模式”variables_info
表包含的信息显示了最近和何时由哪个用户设置每个系统变量。请参见“性能模式variables_info表”。
RESET PERSIST
persisted_variables
因为表的内容与mysqld-auto.cnf
文件的内容相对应,所以会影响表的内容。另一方面,由于RESET PERSIST
不更改变量值,因此它对variables_info
表的内容没有影响,直到重新启动服务器为止。
mysqld-auto.cnf文件的格式和服务器处理
该mysqld-auto.cnf
文件使用以下JSON
格式(为了便于阅读,对其进行了略微调整):
{ "Version": 1, "mysql_server": { "max_connections": { "Value": "152", "Metadata": { "Timestamp": 1.519921356e +15, "User": "root", "Host": "localhost" } }, "transaction_isolation": { "Value": "READ-COMMITTED", "Metadata": { "Timestamp": 1.519921553e +15, "User": "root", "Host": "localhost" } }, "mysql_server_static_options": { "innodb_api_enable_mdl": { "Value": "0", "Metadata": { "Timestamp": 1.519921573e +15, "User": "root", "Host": "localhost" } }, "log_slave_updates": { "Value": "1", "Metadata": { "Timestamp": 1.519921582e +15, "User": "root", "Host": "localhost" } } } } }
启动时,服务器将mysqld-auto.cnf
在所有其他选项文件之后处理该文件(请参见“使用选项文件”)。服务器按以下方式处理文件内容:
- 如果
persisted_globals_load
禁用了系统变量,则服务器将忽略该mysqld-auto.cnf
文件。 SET PERSIST_ONLY
本"mysql_server_static_options"
节中仅显示使用持久化的只读变量。本节中存在的所有变量都将附加到命令行,并使用其他命令行选项进行处理。SET GLOBAL
在服务器开始侦听客户端连接之前,可以通过稍后执行等效的语句来设置所有剩余的持久变量。因此,这些设置直到启动过程的后期才生效,这可能不适用于某些系统变量。最好在中my.cnf
而不是中设置此类变量mysqld-auto.cnf
。
mysqld-auto.cnf
文件的管理应留给服务器。只能使用SET
和RESET PERSIST
语句来操作文件,而不要手动执行:
Removal of the file results in a loss of all persisted settings at the next server startup.(This is permissible if your intent is to reconfigure the server without these settings.)To remove all settings in the file without removing the file itself, use this statement:
RESET PERSIST ;- 手动更改文件可能会在服务器启动时导致解析错误。在这种情况下,服务器将报告错误并退出。如果发生此问题,请在
persisted_globals_load
禁用系统变量或使用--no-defaults
选项的情况下启动服务器。或者,删除mysqld-auto.cnf
文件。但是,如前所述,删除此文件会导致所有持久设置丢失。
非持久性和持久性限制的系统变量
SET PERSIST
并SET PERSIST_ONLY
启用全局系统变量被持久化到mysqld-auto.cnf
数据目录选项文件(见第13.7.6.1,“SET语法变量分配”)。但是,并非所有系统变量都可以持久化,或者仅在某些限制性条件下才能持久化。以下是系统变量不可持久或受持久限制的一些原因:
- 会话系统变量无法持久保存。会话变量不能在服务器启动时设置,因此没有理由将其持久化。
- 全局系统变量可能涉及敏感数据,因此只能由直接访问服务器主机的用户才能设置。
- 全局系统变量可能是只读的(即,仅由服务器设置)。在这种情况下,无论是在服务器启动还是在运行时,用户都无法设置它。
- 全局系统变量可能只供内部使用。
不可持久的系统变量在任何情况下都不能持久化。从MySQL 8.0.14开始,可以使用持久存储限制的系统变量SET PERSIST_ONLY
,但是只有满足以下条件的用户才能保存:
- 该
persist_only_admin_x509_subject
系统变量设置为SSL证书X.509主题值。 - 用户使用加密连接连接到服务器,并提供具有指定主题值的SSL证书。
- 用户具有足够的特权来使用
SET PERSIST_ONLY
(请参见“系统变量特权”)。
例如,它protocol_version
是只读的,并且仅由服务器设置,因此在任何情况下都不能持久保存。另一方面,它bind_address
是持久性限制的,因此可以由满足上述条件的用户设置。
以下系统变量是不可持久的。该列表可能会随着正在进行的开发而更改。
udit_log_current_session audit_log_filter_id character_set_system core_file have_statement_timeout have_symlink hostname innodb_version keyring_hashicorp_auth_path keyring_hashicorp_ca_path keyring_hashicorp_caching keyring_hashicorp_commit_auth_path keyring_hashicorp_commit_ca_path keyring_hashicorp_commit_caching keyring_hashicorp_commit_role_id keyring_hashicorp_commit_server_url keyring_hashicorp_commit_store_path keyring_hashicorp_role_id keyring_hashicorp_secret_id keyring_hashicorp_server_url keyring_hashicorp_store_path large_files_support large_page_size license locked_in_memory log_bin log_bin_basename log_bin_index lower_case_file_system ndb_version ndb_version_string persist_only_admin_x509_subject persisted_globals_load protocol_version relay_log_basename relay_log_index server_uuid skip_external_locking system_time_zone version_comment version_compile_machine version_compile_os version_compile_zlib
受持久限制的系统变量是只读的变量,可以在命令行或选项文件中(persist_only_admin_x509_subject
和除外)进行设置persisted_globals_load
。该列表可能会随着正在进行的开发而更改。
udit_log_file audit_log_format auto_generate_certs basedir bind_address caching_sha2_password_auto_generate_rsa_keys caching_sha2_password_private_key_path caching_sha2_password_public_key_path character_sets_dir daemon_memcached_engine_lib_name daemon_memcached_engine_lib_path daemon_memcached_option datadir default_authentication_plugin ft_stopword_file init_file innodb_buffer_pool_load_at_startup innodb_data_file_path innodb_data_home_dir innodb_dedicated_server innodb_directories innodb_force_load_corrupted innodb_log_group_home_dir innodb_page_size innodb_read_only innodb_temp_data_file_path innodb_temp_tablespaces_dir innodb_undo_directory innodb_undo_tablespaces keyring_encrypted_file_dat keyring_encrypted_file_password lc_messages_dir log_error mecab_rc_file named_pipe pid_file plugin_dir port relay_log relay_log_info_file secure_file_priv sha256_password_auto_generate_rsa_keys sha256_password_private_key_path sha256_password_public_key_path shared_memory shared_memory_base_name skip_networking slave_load_tmpdir socket ssl_c ssl_capath ssl_cert ssl_crl ssl_crlpath ssl_key tmpdir version_tokens_session_number
要将服务器配置为启用持久性限制的持久性系统变量,请使用以下过程:
- 确保将MySQL配置为支持加密连接。请参见“配置MySQL以使用加密连接”。
- 指定SSL证书X.509主题值,该值表示持久存储受限制的系统变量并生成具有该主题的证书的能力。请参见“创建SSL和RSA证书和密钥”。
将服务器
persist_only_admin_x509_subject
设置为指定的Subject值,以启动服务器。例如,将以下行放在服务器my.cnf
文件中:[mysqld] persist_only_admin_x509_subject="subject-value"
Subject值的格式与用于的格式相同
CREATE USER ... REQUIRE SUBJECT
。请参见“ CREATE USER语句”。您必须直接在MySQL服务器主机上执行此步骤,因为
persist_only_admin_x509_subject
它本身不能在运行时持久保存。- 重新启动服务器。
- 将具有指定主题值的SSL证书分发给允许持久存储受限制的系统变量的用户。
假设这myclient-cert.pem
是可以持久存储受限制的系统变量的客户端使用的SSL证书。使用openssl命令显示证书内容:
shell>openssl x509 -text -in myclient-cert.pem Certificate: Dat : Version: 3 (0x2) Serial Number: 2 (0x2) Signature Algorithm: md5WithRSAEncryption Issuer: C=US, ST=IL, L=Chicago, O=MyOrg, OU=CA, CN=MyCN Validity Not Before: Oct 18 17:03:03 2018 GMT Not After : Oct 15 17:03:03 2028 GMT Subject: C=US, ST=IL, L=Chicago, O=MyOrg, OU=client, CN=MyCN ...
该OpenSSL的输出显示证书主题值是:
C=US, ST=IL, L=Chicago, O=MyOrg, OU=client, CN=MyCN
要指定MySQL的主题,请使用以下格式:
/C=US/ST=IL/L=Chicago/O=MyOrg/OU=client/CN=MyCN
my.cnf
使用主题值配置服务器文件:
[mysqld] persist_only_admin_x509_subject="/C=US/ST=IL/L=Chicago/O=MyOrg/OU=client/CN=MyCN"
重新启动服务器,以使新配置生效。
将SSL证书(和任何其他关联的SSL文件)分发给适当的用户。然后,此类用户将使用证书和建立加密连接所需的任何其他SSL选项连接到服务器。
要使用X.509,客户端必须指定--ssl-key
和--ssl-cert
选项进行连接。建议但不要求--ssl-c
也进行指定,以便可以验证服务器提供的公共证书。例如:
shell>mysql --ssl-key=myclient-key.pem --ssl-cert=myclient-cert.pem --ssl-c =mycacert.pem
假设用户具有足够的特权来使用SET PERSIST_ONLY
,则可以像这样持久存储受限制的系统变量:
mysql>SET PERSIST_ONLY socket = '/tmp/mysql.sock'; Query OK, 0 rows affected (0.00 sec)
如果未将服务器配置为启用持久性限制的持久性系统变量,或者用户不满足该功能的要求条件,则会发生错误:
mysql>SET PERSIST_ONLY socket = '/tmp/mysql.sock'; ERROR 1238 (HY000): Variable 'socket' is a non persistent read only variable
结构化系统变量
结构化变量与常规系统变量在两个方面不同:
- 它的值是一个结构,其中的组件指定了被认为密切相关的服务器参数。
- 给定类型的结构变量可能有多个实例。每个名称都有不同的名称,并且指的是服务器维护的不同资源。
MySQL支持一种结构化变量类型,该结构化类型指定用于控制键缓存操作的参数。键高速缓存结构化变量具有以下组件:
key_buffer_size
key_cache_block_size
key_cache_division_limit
key_cache_age_threshold
本节描述了引用结构变量的语法。密钥缓存变量用于语法示例,但是有关密钥缓存如何工作的特定详细信息,请参见“ MyISAM密钥缓存”。
要引用结构变量实例的组件,可以使用instance_name.component_name
格式的复合名称。例子:
hot_cache.key_buffer_size hot_cache.key_cache_block_size cold_cache.key_cache_block_size
对于每个结构化系统变量,default
总是预定义名称为的实例。如果引用的结构变量的组件没有任何实例名称,default
则使用该实例。因此,default.key_buffer_size
与key_buffer_size
这两个指代相同的系统变量。
结构化变量实例和组件遵循以下命名规则:
- 对于给定类型的结构变量,每个实例必须具有在该类型的变量内唯一的名称。但是,实例名称不必在结构化变量类型之间唯一。例如,每个结构化变量都有一个名为的实例
default
,因此default
在变量类型之间不是唯一的。 - 每个结构变量类型的组件名称在所有系统变量名称中必须唯一。如果不正确(也就是说,如果两种不同类型的结构化变量可以共享组件成员名称),则不清楚使用哪个默认结构化变量来引用不受实例名称限定的成员名称。
- 如果结构变量实例名称作为未引用标识符不合法,请使用反引号将其引用为引用标识符。例如,
hot-cache
不合法,但是合法`hot-cache`
。 global
,session
和local
不是合法实例名称。这避免了与诸如引用非结构化系统变量之类的符号的冲突。@@GLOBAL.var_name
当前,前两个规则不可能被违反,因为唯一的结构化变量类型是键缓存的类型。如果将来会创建其他类型的结构化变量,这些规则将具有更大的意义。
除了一个例外,您可以在可能出现简单变量名称的任何上下文中使用复合名称来引用结构化变量组件。例如,您可以使用命令行选项将值分配给结构化变量:
shell>mysqld --hot_cache.key_buffer_size=64K
在选项文件中,使用以下语法:
[mysqld] hot_cache.key_buffer_size=64K
如果使用此选项启动服务器,则hot_cache
除了默认大小为8MB的默认密钥缓存外,它还会创建一个名为64KB的密钥缓存。
假设您按以下方式启动服务器:
shell>mysqld --key_buffer_size=256K \ --extra_cache.key_buffer_size=128K \ --extra_cache.key_cache_block_size=2048
在这种情况下,服务器会将默认密钥缓存的大小设置为256KB。(您也可能已经写过--default.key_buffer_size=256K
。)此外,服务器还会创建一个名为extra_cache
128KB 的第二个键高速缓存,并将用于缓存表索引块的块缓冲区的大小设置为2048字节。
以下示例使用大小为3:1:1的三个不同的键高速缓存启动服务器:
shell>mysqld --key_buffer_size=6M \ --hot_cache.key_buffer_size=2M \ --cold_cache.key_buffer_size=2M
结构变量值也可以在运行时设置和检索。例如,要设置名为hot_cache
10MB 的密钥缓存,请使用以下任一语句:
mysql>SET GLOBAL hot_cache.key_buffer_size = 10*1024*1024; mysql>SET @@GLOBAL.hot_cache.key_buffer_size = 10*1024*1024;
要检索缓存大小,请执行以下操作:
mysql>SELECT @@GLOBAL.hot_cache.key_buffer_size;
但是,以下语句不起作用。该变量不解释为复合名称,而是解释为LIKE
模式匹配操作的简单字符串:
mysql>SHOW GLOBAL VARIABLES LIKE 'hot_cache.key_buffer_size';
这是例外,它可以在可能出现简单变量名的任何地方使用结构化变量名。