环境概述
MySQL 8.0
系统变量(System Variables)是什么?
系统变量,由 MySQL 维护,用于控制 MySQL 行为。
某些系统变量是由组件与插件安装的变量,当插件或组件安装后才可使用。这些变量具有“组件名前缀”(或“插件名前缀”),但是他们依旧属于系统变量。
系统变量的作用范围
全局 与 会话
系统变量具有两个作用范围:全局,影响服务的整个操作;会话,影响当前客户端连接的操作;
给定的某个系统变量,可以同时具有全局值与会话值。
两者之间的关系
在服务启动时,所有全局变量初始化为默认值,或者在选项中配置的值。
在客户端连接时,使用全局变量值初始化会话变量值。注意,某些特殊变量,会话参数值不会被全局参数值初始化,在文档描述中会有说明
如何设置系统变量?
每个系统变量都有默认值。
在启动时,可以通过命令行选项设置;或者通过配置文件(my.cnf)设置;
在运行时,多数变量可以通过 SET 语句设置,这无需重启或停止数据库。
命令行选项
1)与普通命令行选项无异
2)使用横线、下划线皆可:--general_log=ON、--general-log=ON
3)可以使用单位(K、M、G),大小写皆可:--innodb-log-file-size=16M --max-allowed-packet=1G
通过命令行选项 --maximum-var_name=value 形式,可以限制 SET 可设置的参数最大值。
配置文件(my.cnf)
1)与命令行选项类似,只需去除前缀:
[mysqld] innodb_log_file_size=16M max_allowed_packet=1G
使用 SET 语句
多数变量可以使用 SET 语句修改:
1)通过名称引用;
2)并前缀修饰符(可选);
3)只能使用下划线,不能使用横线;
使用 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 max_connections = 1000; SET @@PERSIST_ONLY.max_connections = 1000;
设置会话变量
SET SESSION sql_mode = 'TRADITIONAL'; SET @@SESSION.sql_mode = 'TRADITIONAL'; SET @@sql_mode = 'TRADITIONAL';
注意事项
在修改全局变量后,会为新连接使用新值;对于现有连接,修改全局变量的值不会影响到对应的会话变量(即使是在当前连接中只用SET GLOBAL语句,也不会影响对应的会话变量)。
在服务重启后,全局变量会失效。如果要持久化,应该写入配置文件。
查看系统变量
使用 SHOW VARIABLES LIKE 'var_mame'; 或者 SHOW VARIABLES 语句来查看系统变量。
注意事项:
1)建议使用下划线,因为变量都是以下划线存储在数据库中的。
需要的用于权限
Section 5.1.9.1, “System Variable Privileges”
参考文献
MySQL 中的变量:系统变量(包括:会话变量、全局变量)、会话变量(包括:局部变量、会话变量)
How to change MySQL system parameters/variables
MySQL 5.7 Reference Manual/13.7.4.1 SET Syntax for Variable Assignment