24、MySQL 8.0 5.1.6使用系统变量

MySQL服务器维护许多系统变量,指出它如何配置。第5.1.5节“服务器系统变量”描述了这些变量的含义。每个系统变量都有一个默认值。可以在服务器启动时使用命令行上的选项或选项文件来设置系统变量。它们中的大多数都可以在服务器通过SET 语句运行时动态更改 ,这使您可以修改服务器的操作,而无需停止并重新启动它。您也可以在表达式中使用系统变量值。


由服务器组件实现的系统变量在安装该组件时公开并且具有以组件特定前缀开头的名称。例如, log_filter_dragnet错误日志过滤器组件实现了一个名为的系统变量 log_error_filter_rules,其全名是 dragnet.log_error_filter_rules。要引用此变量,请使用全名。


有两个系统变量存在的范围。全局变量影响服务器的整体操作。会话变量影响其对各个客户端连接的操作。给定的系统变量可以同时具有全局值和会话值。全局和会话系统变量如下所示:


当服务器启动时,它将每个全局变量初始化为其默认值。这些默认值可以通过在命令行或选项文件中指定的选项来更改。(请参见 第4.2.3节“指定程序选项”。)


服务器还为每个连接的客户端维护一组会话变量。客户端的会话变量在连接时使用相应全局变量的当前值进行初始化。例如,客户端的SQL模式由会话sql_mode值控制,该 值在客户端连接到全局sql_mode值的值时被初始化。


对于某些系统变量,会话值不是从相应的全局值初始化的; 如果是这样,则在变量描述中指出。


通过使用命令行或选项文件中的选项,可以在服务器启动时全局设置系统变量值。当您使用启动选项设置采用数字值的变量时,可以使用后缀“ K, M”或G(大写或小写)给出该值,以表示倍数1024,1024 2或1024 3 ; 即分别为千字节,兆字节或千兆字节的单位。因此,以下命令以InnoDB16兆字节的日志文件大小和1千兆字节的最大数据包大小启动服务器:


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=valueinnodb_log_file_size--maximum-innodb_log_file_size=32M


许多系统变量都是动态的,可以在运行时通过使用SET 语句来更改 。有关列表,请参见 第5.1.6.2节“动态系统变量”。要更改系统变量 SET,请按名称引用它,可选地在前面加上一个修饰符:


要指出一个变量是一个全局变量,在其名称前面加上GLOBAL关键字或 @@global.限定符:


SET GLOBAL max_connections = 1000;
SET @@global.max_connections = 1000;
该SYSTEM_VARIABLES_ADMIN或 SUPER特权需要设置全局变量。


设置全局变量的另一种方法是在PERSIST关键字或 @@persist.限定符之前添加其名称:


SET PERSIST max_connections = 1000;
SET @@persist.max_connections = 1000;
通过此SET语法,您可以在运行时进行配置更改,这种更改在服务器重新启动时也持续存在 就像 SET GLOBAL, SET PERSIST改变了运行时的变量值,而且还会变量设置一个选项叫文件 mysqld-auto.cnf在数据目录(替换任何现有的变量设置,如果有一个)。在启动时,服务器在所有其他选项文件之后处理该文件。该 SYSTEM_VARIABLES_ADMIN或 SUPER权限才能坚持全局变量。


注意
mysqld-auto.cnf文件的 管理应留给服务器,不要手动执行:


删除文件会导致下次服务器启动时丢失所有持久设置。(如果您的意图是不使用这些设置重新配置服务器,则这是允许的。)要删除文件中的所有设置而不删除文件本身,请使用以下语句:


RESET PERSIST;
手动更改文件可能导致服务器启动时出现分析错误。在这种情况下,服务器会报告错误并退出。如果发生此问题,请启动服务器并 persisted_globals_load 禁用系统变量或使用 --no-defaults选项。或者,删除mysqld-auto.cnf文件,但如前所述,删除此文件会导致所有持久设置丢失。


如果插件在SET PERSIST执行时被安装,插件变量可以被持久化。如果插件仍然安装,持久化插件变量的分配将对后续服务器重新启动生效。如果插件不再安装,则当服务器读取mysqld-auto.cnf文件时,插件变量将不存在。在这种情况下,服务器向错误日志写入警告并继续:


currently unknown variable 'var_name'
was read from the persisted config file
该PERSIST_ONLY关键字或 @@persist_only.限定类似于 PERSIST:


SET PERSIST_ONLY back_log = 1000;
SET @@persist_only.back_log = 1000;
像PERSIST, PERSIST_ONLY写入变量设置 mysqld-auto.cnf。但是,不像 PERSIST,PERSIST_ONLY 不会修改运行时全局系统变量值,使其适用于配置只能在服务器启动时设置的只读系统变量。该 PERSIST_RO_VARIABLES_ADMIN 特权需要使用PERSIST_ONLY。


该mysqld-auto.cnf文件使用这样的格式(稍微重新格式化):


{
  "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"
        }
      }
    }
  }
}
只有只读变量持续使用 PERSIST_ONLY写入该 "mysql_server_static_options"部分。"mysql_server_static_options"服务器启动时,该部分内的所有变量都会 附加到命令行中。通过执行SET GLOBAL语句来设置所有剩余的持久变量 。


要指出变量是会话变量,请在其名称前面加上SESSION关键字或者 @@session.或者@@ 限定符:


SET SESSION sql_mode = 'TRADITIONAL';
SET @@session.sql_mode = 'TRADITIONAL';
SET @@sql_mode = 'TRADITIONAL';
设置会话变量通常不需要特殊权限,但有例外情况需要 SYSTEM_VARIABLES_ADMIN或 SUPER特权(例如 sql_log_bin)。客户端可以更改自己的会话变量,但不能更改其他客户端的会话变量。


仅会话系统变量不能被保存。它们不能在服务器启动时设置,所以没有理由列出它们mysqld-auto.cnf。


LOCAL并且@@local.是同义词SESSION和 @@session.。


如果不存在修饰符,则 SET 更改会话变量。


在这些情况下发生错误:


在设置仅具有会话值的变量时 使用SET GLOBAL(或@@global.), SET PERSIST(或@@persist.)或 SET PERSIST_ONLY(或 @@persist_only.)


mysql> SET GLOBAL sql_log_bin = ON;
ERROR 1228 (HY000): Variable 'sql_log_bin' is a SESSION
variable and can't be used with SET GLOBAL
设置仅具有全局值的变量时 省略GLOBAL(或 @@global.),PERSIST (或@@persist.)或 PERSIST_ONLY(或 @@persist_only.):


mysql> SET max_connections = 1000;
ERROR 1229 (HY000): Variable 'max_connections' is a
GLOBAL variable and should be set with SET GLOBAL
在设置仅具有全局值的变量时 使用SET SESSION(或@@SESSION.):


mysql> SET SESSION max_connections = 1000;
ERROR 1229 (HY000): Variable 'max_connections' is a
GLOBAL variable and should be set with SET GLOBAL
前面的修饰符只适用于系统变量。尝试将它们应用于用户定义的变量,存储过程或函数参数或存储的程序局部变量时发生错误。


一个SET 语句可以包含多个变量赋值,用逗号分隔。该语句将值分配给用户定义的变量和系统变量:


SET @x = 1, SESSION sql_mode = '';
如果设置多个系统变量,最近一段时间 GLOBAL,PERSIST, PERSIST_ONLY,或SESSION 在语句修饰用于以下有没有指定的组合分配。


多变量赋值的例子:


SET GLOBAL sort_buffer_size = 1000000, SESSION sort_buffer_size = 1000000;
SET @@global.sort_buffer_size = 1000000, @@local.sort_buffer_size = 1000000;
SET GLOBAL max_connections = 1000, sort_buffer_size = 1000000;
如果语句中的任何变量赋值 SET 失败,则整个语句将失败,并且不会更改变量,也不会mysqld-auto.cnf更改文件。


如果更改了会话系统变量,则该值将在会话中保持有效,直到您将变量更改为不同的值或会话结束。该更改对其他会话没有影响。


如果更改全局系统变量,则会将该值记住并用于新会话,直到将该变量更改为其他值或服务器退出。任何访问全局变量的客户端都可以看到该更改。但是,更改仅影响更改后连接的客户端的相应会话变量。全局变量更改不影响任何当前客户端会话的会话变量(甚至不包括SET GLOBAL 发生该语句的会话 )。


要使全局系统变量设置为永久性的,以便它适用于跨服务器重新启动,请修改它 SET PERSIST或PERSIST_ONLY 将其记录在mysqld-auto.cnf文件中。也可以使用SET GLOBAL和手动修改my.cnf 文件,但这更麻烦,并且手动输入设置中的错误可能直到很晚才会被发现。 SET PERSIST或者PERSIST_ONLY更方便,并避免错误设置的可能性。


性能模式 persisted_variables表为该mysqld-auto.cnf文件提供了一个SQL接口,使其能够在运行时使用SELECT语句来检查其内容 。请参见 第26.11.13.1节“性能模式persisted_variables表”。


Performance Schema variables_info 表格包含显示最近设置每个系统变量的时间和用户的信息。请参见 第26.11.13.2节“性能模式变量_信息表”。


要将GLOBAL编译的MySQL默认值或SESSION变量的GLOBAL值设置为当前对应值,请将变量设置为该值DEFAULT。例如,以下两个语句在将会话值设置max_join_size为当前全局值时是相同的:


SET @@session.max_join_size=DEFAULT;
SET @@session.max_join_size=@@global.max_join_size;
并非所有系统变量都可以设置为DEFAULT。在这种情况下,将DEFAULT结果分配给错误。


使用SET PERSIST(或@@persist.),将全局变量设置为DEFAULT或设置为其默认值时,会将该变量的默认值分配给该变量,并为该变量添加一个设置mysqld-auto.cnf。要从文件中删除变量,请使用 RESET PERSIST。


尝试分配DEFAULT 给用户定义变量,存储过程或函数参数或存储的程序局部变量时发生错误。


要在表达式中引用系统变量的值,请使用其中一个@@-modifiers(除非 @@persist.表达式中不允许)。例如,您可以SELECT像这样在一个语句中检索值 :


SELECT @@global.sql_mode, @@session.sql_mode, @@sql_mode;
为了引用表达式中的系统变量 (而不是or ),MySQL会返回会话值(如果存在的话),否则返回全局值。这不同于 ,它总是指会话值。 @@var_name@@global.@@session.SET @@var_name = expr


在服务器启动时设置变量时,可以使用用于指定值乘数的后缀,但不要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返回SESSION值。


GLOBAL在设置GLOBAL-only变量时 要求使用关键字的原因是,在检索它们时不要使用关键字以防止将来出现问题:


被我们删除SESSION具有相同名称作为变量GLOBAL变量,客户端与 SYSTEM_VARIABLES_ADMIN或 SUPER特权可能会意外地改变GLOBAL变量,而不仅仅是SESSION为它的连接变量。


如果我们要添加一个SESSION与变量名称相同的GLOBAL变量,那么打算更改该GLOBAL变量的客户端可能只会找到自己的SESSION变量。本文由:学什么技术好网翻译
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章