• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 使用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是等效的。

    当使用启动选项设置一个变量,需要一个数字值,该值可以与一个后缀被给予KMG(大写或小写),以指示1024一乘法器,1024 2或1024 3 ;也就是说,分别以千字节,兆字节或千兆字节为单位。从MySQL 8.0.14的,后缀也可以是TPE以指示1024乘法器4,1024 5 或1024 6。因此,以下命令将以InnoDB16兆字节的日志文件大小和1 GB的最大数据包大小启动服务器:

    mysqld --innodb-log-file-size=16M --max-allowed-packet=1G
    

    在选项文件中,这些变量的设置如下:

    [mysqld]
    innodb_log_file_size=16M
    max_allowed_packet=1G
    

    后缀字母的字母大小写无关紧要;16M16m等价,与1G和等价1g

    要使用该SET语句限制可以在运行时将系统变量设置为的最大值,请在服务器启动时使用格式的选项来指定此最大值。例如,要防止在运行时将的值增加到32MB以上,请使用选项。--maximum-var_name=valueinnodb_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。但是,要在命令行或选项文件中设置此类变量,必须将其设置为10。将其设置为ONOFF将不起作用。例如,在命令行上有效,--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_ADMINSUPER特权的语句。
    • 要将全局系统变量持久化到mysqld-auto.cnf文件中(并设置运行时值),请使用SET PERSIST需要SYSTEM_VARIABLES_ADMINor SUPER特权的语句。
    • 要将全局系统变量持久化到mysqld-auto.cnf文件(不设置运行时值),请使用SET PERSIST_ONLY需要SYSTEM_VARIABLES_ADMINPERSIST_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_ADMINSUPER特权。
    • 对于只读系统变量,RESET PERSIST需要SYSTEM_VARIABLES_ADMINPERSIST_RO_VARIABLES_ADMIN特权。
    • 对于持久限制变量,RESET PERSIST不需要使用特定SSL证书建立的到服务器的加密连接。

    如果全局系统变量具有上述特权要求的任何例外,则变量描述会指示这些例外。示例包括default_table_encryptionmandatory_roles,它们需要其他特权。这些附加特权适用于设置全局运行时值的操作,但不适用于保留该值的操作。

    要设置会话系统变量运行时值,请使用以下SET SESSION语句。与设置全局运行时值相反,设置会话运行时值通常不需要特殊特权,并且任何用户都可以完成以影响当前会话。对于某些系统变量,设置会话值可能会在当前会话之外产生影响,因此是受限制的操作,只有具有特殊特权的用户才能执行此操作:

    • 从MySQL 8.0.14开始,所需的特权是SESSION_VARIABLES_ADMIN

      注意

      暗含SYSTEM_VARIABLES_ADMINSUPER有效拥有SESSION_VARIABLES_ADMIN的任何用户都不需要SESSION_VARIABLES_ADMIN明确授予。

    • 在MySQL 8.0.14之前,所需的特权为SYSTEM_VARIABLES_ADMINSUPER

    如果会话系统变量受限制,则变量描述指示该限制。示例包括binlog_formatsql_log_bin。设置这些变量的会话值会影响当前会话的二进制日志记录,但也可能对服务器复制和备份的完整性产生更广泛的影响。

    SESSION_VARIABLES_ADMIN使管理员能够最大程度地减少以前可能已被授予权限的用户的权限,SYSTEM_VARIABLES_ADMIN或者SUPER使他们能够修改受限会话系统变量。假设管理员创建了以下角色,以赋予设置受限会话系统变量的能力:

    CREATE ROLE set_session_sysvars;
    GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO set_session_sysvars;
    

    任何被授予set_session_sysvars角色的用户(并且具有该角色的角色)都可以设置受限的会话系统变量。但是,该用户也能够设置全局系统变量,这可能是不希望的。

    通过将角色修改为具有SESSION_VARIABLES_ADMIN而不是SYSTEM_VARIABLES_ADMIN,可以将角色特权降低为设置受限会话系统变量的能力,而没有其他设置。要修改角色,请使用以下语句:

    GRANT SESSION_VARIABLES_ADMIN ON *.* TO set_session_sysvars;
    REVOKE SYSTEM_VARIABLES_ADMIN ON *.* FROM set_session_sysvars;
    

    修改角色具有立竿见影的效果:被授予set_session_sysvars角色的任何帐户在没有SYSTEM_VARIABLES_ADMIN明确授予该功能的情况下,将不再具有并且不能设置全局系统变量。可以将类似的GRANT/REVOKE序列应用于SYSTEM_VARIABLES_ADMIN直接授予的任何帐户,而不是通过角色进行的帐户。

    动态系统变量

    许多服务器系统变量是动态的,可以在运行时设置。请参见“变量分配的SET语法”。有关设置系统变量的特权要求的说明,请参见“系统变量特权”

    下表列出了适用于的所有动态系统变量mysqld

    该表列出了每个变量的数据类型和范围。最后一列指示每个变量的作用域是全局变量,会话变量还是两者。有关设置和使用变量的详细信息,请参见相应的项目描述。在适当的地方,提供了指向有关该项目的更多信息的直接链接。

    类型为“ string ”的变量采用字符串值。类型为“ numeric ”的变量采用数字值。可以将类型为“ boolean ”的变量设置为0、1 ONOFF。标记为“枚举”的变量通常应设置为该变量的可用值之一,但也可以设置为与所需枚举值相对应的数字。对于枚举的系统变量,第一个枚举值对应于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 GLOBALSET PERSIST设置全局变量运行时值,但还将变量设置写入mysqld-auto.cnf文件(如果存在,则替换任何现有的变量设置)。

    • 要在mysqld-auto.cnf不设置全局变量运行时值的情况下将全局系统变量持久化到文件中,请在变量名称前添加PERSIST_ONLY关键字或@@PERSIST_ONLY.限定符:

      SET PERSIST_ONLY back_log = 1000;
      SET @@PERSIST_ONLY.back_log = 1000;
      

      喜欢PERSISTPERSIST_ONLY将变量设置写入mysqld-auto.cnf。但是,与不同PERSISTPERSIST_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 PERSISTpersisted_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文件的管理应留给服务器。只能使用SETRESET 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 PERSISTSET 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
    

    要将服务器配置为启用持久性限制的持久性系统变量,请使用以下过程:

    1. 确保将MySQL配置为支持加密连接。请参见“配置MySQL以使用加密连接”。
    2. 指定SSL证书X.509主题值,该值表示持久存储受限制的系统变量并生成具有该主题的证书的能力。请参见“创建SSL和RSA证书和密钥”。
    3. 将服务器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它本身不能在运行时持久保存。

    4. 重新启动服务器。
    5. 将具有指定主题值的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_sizekey_buffer_size这两个指代相同的系统变量。

    结构化变量实例和组件遵循以下命名规则:

    • 对于给定类型的结构变量,每个实例必须具有该类型的变量唯一的名称。但是,实例名称不必结构化变量类型之间唯一。例如,每个结构化变量都有一个名为的实例default,因此default在变量类型之间不是唯一的。
    • 每个结构变量类型的组件名称在所有系统变量名称中必须唯一。如果不正确(也就是说,如果两种不同类型的结构化变量可以共享组件成员名称),则不清楚使用哪个默认结构化变量来引用不受实例名称限定的成员名称。
    • 如果结构变量实例名称作为未引用标识符不合法,请使用反引号将其引用为引用标识符。例如,hot-cache不合法,但是合法`hot-cache`
    • globalsessionlocal不是合法实例名称。这避免了与诸如引用非结构化系统变量之类的符号的冲突。@@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_cache128KB 的第二个键高速缓存,并将用于缓存表索引块的块缓冲区的大小设置为2048字节。

    以下示例使用大小为3:1:1的三个不同的键高速缓存启动服务器:

    shell>mysqld --key_buffer_size=6M \
    --hot_cache.key_buffer_size=2M \
    --cold_cache.key_buffer_size=2M
    

    结构变量值也可以在运行时设置和检索。例如,要设置名为hot_cache10MB 的密钥缓存,请使用以下任一语句:

    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';
    

    这是例外,它可以在可能出现简单变量名的任何地方使用结构化变量名。