MySQL5.7 使用系统变量
官网地址:MySQL :: MySQL 5.7 Reference Manual :: 5.1.8 Using System Variables
欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯.
MySQL 服务器维护许多配置其操作的系统变量。第 5.1.7 节“服务器系统变量”描述了这些变量的含义。每个系统变量都有一个默认值。可以在服务器启动时使用命令行或选项文件中的选项设置系统变量。其中大多数可以在服务器运行时通过语句动态更改 SET ,这使您无需停止并重新启动服务器即可修改服务器的操作。您还可以在表达式中使用系统变量值。
许多系统变量是内置的。由服务器插件实现的系统变量在安装插件时公开,并且其名称以插件名称开头。例如,该 audit_log
插件实现了一个名为 的系统变量audit_log_policy。
系统变量存在两个范围。全局变量影响服务器的整体运行。会话变量影响各个客户端连接的操作。给定的系统变量可以同时具有全局值和会话值。全局变量和会话系统变量的关系如下:
-
当服务器启动时,它将每个全局变量初始化为其默认值。这些默认值可以通过命令行或选项文件中指定的选项进行更改。(请参见 第 4.2.2 节“指定程序选项”。)
-
服务器还为每个连接的客户端维护一组会话变量。客户端的会话变量在连接时使用相应全局变量的当前值进行初始化。例如,客户端的SQL模式由会话 sql_mode值控制,该会话值在客户端连接到全局值的值时初始化sql_mode。
对于某些系统变量,会话值不是从相应的全局值初始化的;如果是这样,则会在变量描述中指出。
系统变量值可以在服务器启动时使用命令行或选项文件中的选项进行全局设置。启动时,系统变量的语法与命令选项的语法相同,因此在变量名称中,破折号和下划线可以互换使用。例如 --general_log=ON和 --general-log=ON是等价的。
当您使用启动选项设置采用数值的变量时,可以使用后缀 K
、M
、 或 G
(大写或小写)来指定该值,以指示乘数 1024、1024 2或 1024 3;即分别以千字节、兆字节或千兆字节为单位。因此,以下命令启动服务器,InnoDB
日志文件大小为 16 MB,最大数据包大小为 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-
innodb_log_file_sizevar_name
=value
--maximum-innodb-log-file-size=32M
许多系统变量是动态的,可以在运行时使用 SET 语句进行更改。有关列表,请参见 第 5.1.8.2 节 “动态系统变量”。要使用 更改系统变量 SET,请按名称引用它,可以在前面加上修饰符。在运行时,系统变量名称必须使用下划线编写,而不是破折号。以下示例简要说明了此语法:
-
设置全局系统变量:
SET GLOBAL max_connections = 1000; SET @@GLOBAL.max_connections = 1000;
-
设置会话系统变量:
SET SESSION sql_mode = 'TRADITIONAL'; SET @@SESSION.sql_mode = 'TRADITIONAL'; SET @@sql_mode = 'TRADITIONAL';
有关 SET 语法的完整详细信息,请参见第 13.7.4.1 节 “变量赋值的 SET 语法”。有关设置系统变量的权限要求的描述,请参见 第 5.1.8.1 节 “系统变量权限”
在服务器启动时设置变量时可以使用用于指定值乘数的后缀,但不能SET 在运行时设置值。另一方面, SET您可以使用表达式分配变量的值,但在服务器启动时设置变量时则不然。例如,以下行中的第一行在服务器启动时是合法的,但第二行则不是:
$> mysql --max_allowed_packet=16M
$> mysql --max_allowed_packet=16*1024*1024
相反,以下行中的第二行在运行时是合法的,但第一行不是:
mysql> SET GLOBAL max_allowed_packet=16M;
mysql> SET GLOBAL max_allowed_packet=16*1024*1024;
要显示系统变量名称和值,请使用以下 SHOW VARIABLES语句:
mysql> SHOW VARIABLES;
+---------------------------------+-----------------------------------+
| Variable_name | Value |
+---------------------------------+-----------------------------------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
| automatic_sp_privileges | ON |
| back_log | 50 |
| basedir | /home/mysql/ |
| binlog_cache_size | 32768 |
| bulk_insert_buffer_size | 8388608 |
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /home/mysql/share/mysql/charsets/ |
| collation_connection | utf8_general_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
...
| innodb_autoextend_increment | 8 |
| innodb_buffer_pool_size | 8388608 |
| innodb_checksums | ON |
| innodb_commit_concurrency | 0 |
| innodb_concurrency_tickets | 500 |
| innodb_data_file_path | ibdata1:10M:autoextend |
| innodb_data_home_dir | |
...
| version | 5.7.18-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
在设置 -only 变量时 需要关键字,但在检索变量时不需要关键字的原因GLOBAL
是为了防止将来出现问题:
-
如果
SESSION
要删除的变量与某个变量同名GLOBAL
,则具有足以修改全局变量的权限的客户端可能会意外更改该GLOBAL
变量,而不仅仅是SESSION
其自己会话的变量。 -
如果
SESSION
要添加与变量同名的变量GLOBAL
,则打算更改该GLOBAL
变量的客户端可能会发现只更改了自己的SESSION
变量。
系统变量可以具有影响整个服务器操作的全局值、仅影响当前会话的会话值或两者。要修改系统变量运行时值,请使用该 SET 语句。请参见第 13.7.4.1 节“变量赋值的 SET 语法”。本节描述在运行时为系统变量赋值所需的权限。
设置全局系统变量运行时值需要该 SUPER权限。
要设置会话系统变量运行时值,请使用该 SET SESSION语句。与设置全局运行时值相比,设置会话运行时值通常不需要特殊权限,并且任何用户都可以执行此操作来影响当前会话。对于某些系统变量,设置会话值可能会在当前会话之外产生影响,因此是一项受限操作,只有具有权限的用户才能完成 SUPER。如果会话系统变量以这种方式受到限制,则变量描述会指示该限制。示例包括 binlog_format和 sql_log_bin。设置这些变量的会话值会影响当前会话的二进制日志记录,但也可能对服务器复制和备份的完整性产生更广泛的影响。
许多服务器系统变量是动态的,可以在运行时设置。请参见第 13.7.4.1 节“变量赋值的 SET 语法”。有关设置系统变量的权限要求的描述,请参见 第 5.1.8.1 节 “系统变量权限”
下表列出了 中适用的所有动态系统变量mysqld
。
该表列出了每个变量的数据类型和范围。最后一列指示每个变量的范围是全局、会话还是两者。有关变量的设置和使用的详细信息,请参见相应项目的说明。在适当的情况下,提供有关该项目的更多信息的直接链接。
具有“字符串” 类型的变量采用字符串值。具有“数字”类型的变量 采用数字值。具有“布尔”类型的变量可以设置为 0、1 ON
或OFF
。标记为“枚举”的变量通常应设置为该变量的可用值之一,但也可以设置为与所需枚举值相对应的数字。对于枚举系统变量,第一个枚举值对应于 0。这与 ENUM用于表列的数据类型,第一个枚举值对应于 1。
表 5.4 动态系统变量汇总
结构化变量与常规系统变量有两个不同之处:
-
它的值是一个包含指定被认为密切相关的服务器参数的组件的结构。
-
给定类型的结构化变量可能有多个实例。每一个都有不同的名称,并指代服务器维护的不同资源。
MySQL 支持一种结构化变量类型,它指定控制键缓存操作的参数。键缓存结构化变量具有以下组件:
本节描述引用结构化变量的语法。键缓存变量用于语法示例,但有关键缓存如何操作的具体细节可以在其他地方找到,即第8.10.2 节“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
目前,前两条规则不可能被违反,因为唯一的结构化变量类型是用于键缓存的类型。如果将来创建其他类型的结构化变量,这些规则可能会具有更大的意义。
除了一个例外,您可以在任何可能出现简单变量名称的上下文中使用复合名称来引用结构化变量组件。例如,您可以使用命令行选项为结构化变量赋值:
$> mysqld --hot_cache.key_buffer_size=64K
在选项文件中,使用以下语法:
[mysqld]
hot_cache.key_buffer_size=64K
如果使用此选项启动服务器,hot_cache
除了默认大小为 8MB 的默认密钥缓存之外,它还会创建一个名为 64KB 的密钥缓存。
假设您按如下方式启动服务器:
$> 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:
$> 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';
这是能够在任何可能出现简单变量名的地方使用结构化变量名的例外情况。