暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

5.1.9 Using System Variables

原创 由迪 2020-05-07
770

5.1.9.1 System Variable Privileges
5.1.9.2 Dynamic System Variables
5.1.9.3 Persisted System Variables
5.1.9.4 Nonpersistible and Persist-Restricted System Variables
5.1.9.5 Structured System Variables

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

内置了许多系统变量。服务器插件或组件也可以安装系统变量:

服务器插件实现的系统变量在安装插件时公开,并且其名称以插件名称开头。例如,该audit_log 插件实现了名为的系统变量 audit_log_policy。

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

系统变量存在两个范围。全局变量会影响服务器的整体操作。会话变量会影响单个客户端连接的操作。给定的系统变量可以具有全局值和会话值。全局和会话系统变量之间的关系如下:

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

服务器还为每个连接的客户端维护一组会话变量。客户端的会话变量在连接时使用相应全局变量的当前值进行初始化。例如,客户端的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。因此,以下命令以InnoDB16 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-var_name=valueinnodb_log_file_size–maximum-innodb-log-file-size=32M

许多系统变量都是动态的,可以在运行时通过使用SET 语句来更改 。有关列表,请参见 第5.1.9.2节“动态系统变量”。要使用更改系统变量 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 语法的完整详细信息 ,请参见第13.7.6.1节“变量分配的SET语法”。有关设置和保留系统变量的特权要求的说明,请参见第5.1.9.1节“系统变量特权”

在服务器启动时设置变量时可以使用用于指定值乘数的后缀,但SET 在运行时不能使用后缀来设置值。另一方面,使用 SET可以使用表达式分配变量的值,而在服务器启动时设置变量时则不正确。例如,以下第一行在服务器启动时是合法的,但第二行则不是:

shell> mysql --max_allowed_packet=16M
shell> mysql --max_allowed_packet=1610241024
相反,以下第二行在运行时是合法的,但第一行则不是:

mysql> SET GLOBAL max_allowed_packet=16M;
mysql> SET GLOBAL max_allowed_packet=1610241024;
注意
可以通过将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 变量已更改。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论