系统变量简介
MySQL服务器程序运行过程中会用到许多影响程序行为的变量,它们被称为MySQL系统变量,比如允许同时连入的客户端数量用系统变量max_connections表示,表的默认存储引擎用系统变量default_storage_engine表示,查询缓存的大小用系统变量query_cache_size表示,MySQL服务器程序的系统变量有好几百条,我们就不一一列举了。
我们可以使用下列命令查看MySQL服务器程序支持的系统变量以及它们的当前值:
1 | SHOW VARIABLES [LIKE 匹配的模式]; |
设置系统变量
通过启动选项设置
1.通过命令行添加启动选项。
2.通过配置文件添加启动选项
服务器程序运行过程中设置
设置不同作用范围的系统变量
我们前面说过,多个客户端程序可以同时连接到一个服务器程序。对于同一个系统变量,我们有时想让不同的客户端有不同的值。比方说狗哥使用客户端A,他想让当前客户端对应的默认存储引擎为InnoDB,所以他可以把系统变量default_storage_engine的值设置为InnoDB;猫爷使用客户端B,他想让当前客户端对应的默认存储引擎为MyISAM,所以他可以把系统变量default_storage_engine的值设置为MyISAM。这样可以使狗哥和猫爷的的客户端拥有不同的默认存储引擎,使用时互不影响,十分方便。但是这样各个客户端都私有一份系统变量会产生这么两个问题:
- 有一些系统变量并不是针对单个客户端的,比如允许同时连接到服务器的客户端数量max_connections,查询缓存的大小query_cache_size,这些公有的系统变量让某个客户端私有显然不合适。
- 一个新连接到服务器的客户端对应的系统变量的值该怎么设置?
为了解决这两个问题,设计MySQL的大佬提出了系统变量的作用范围的概念,具体来说作用范围分为这两种,GLOBAL(全局变量,影响服务器整体操作)和SESSION(会话变量,影响某个客户端连接的操作,别名LOCAL)通过启动选项设置的系统变量的作用范围都是GLOBAL的,也就是对所有客户端都有效的
在服务器程序运行期间通过客户端程序设置系统变量的语法:
1 | SET [GLOBAL|SESSION] 系统变量名 = 值; |
查看不同作用范围的系统变量
1 | SHOW [GLOBAL|SESSION] VARIABLES [LIKE 匹配的模式]; |
小贴士:如果某个客户端改变了某个系统变量在GLOBAL
作用范围的值,并不会影响该系统变量在当前已经连接的客户端作用范围为SESSION
的值,只会影响后续连入的客户端在作用范围为SESSION
的值。
注意事项
并不是所有系统变量都具有
GLOBAL
和SESSION
的作用范围。有一些系统变量只具有
GLOBAL
作用范围,比方说max_connections
,表示服务器程序支持同时最多有多少个客户端程序进行连接。有一些系统变量只具有
SESSION
作用范围,比如insert_id
,表示在对某个包含AUTO_INCREMENT
列的表进行插入时,该列初始的值。有一些系统变量的值既具有
GLOBAL
作用范围,也具有SESSION
作用范围,比如我们前面用到的default_storage_engine
,而且其实大部分的系统变量都是这样的,
有些系统变量是只读的,并不能设置值。
比方说
version
,表示当前MySQL
的版本,我们客户端是不能设置它的值的,只能在SHOW VARIABLES
语句里查看。