MySQL 服务器程序运行过程中会用到许多影响程序行为的变量,它们被称为 MySQL 系统变量,比如允许同时连入的客户端数量用系统变量 max_connections 表示,表的默认存储引 擎用系统变量 default_storage_engine 表示,查询缓存的大小用系统变量query_cache_size 表示, MySQL 服务器程序的系统变量有好几百条,我们就不一一列举 了。每个系统变量都有一个默认值,我们可以使用命令行或者配置文件中的选项在启动服 务器时改变一些系统变量的值。大多数的系统变量的值也可以在程序运行过程中修改,而 无需停止并重新启动它。

系统变量 比较牛逼的一点就是,对于大部分系统变量来说,它们的值可以在服务器程序运 行过程中进行动态修改而无需停止并重启服务器。不过系统变量有作用范围之分。

可以设置不同作用范围的系统变量

我们前边说过,多个客户端程序可以同时连接到一个服务器程序。对于同一个系统变量, 我们有时想让不同的客户端有不同的值。比方说狗哥使用客户端A,他想让当前客户端对应 的默认存储引擎为 InnoDB ,所以他可以把系统变量 default_storage_engine 的值设置为InnoDB ;猫爷使用客户端B,他想让当前客户端对应的默认存储引擎为 MyISAM ,所以他可 以把系统变量 default_storage_engine 的值设置为 MyISAM 。这样可以使狗哥和猫爷的的客 户端拥有不同的默认存储引擎,使用时互不影响,十分方便。但是这样各个客户端都私有 一份系统变量会产生这么两个问题:

  1. 有一些系统变量并不是针对单个客户端的,比如允许同时连接到服务器的客户端数量max_connections,查询缓存的大小query_cache_size,这些共有的系统变量让某个客户端私有显然不合适。
  2. 一个新连接到服务的客户端对应的系统变量的值该怎么设置呢?

为了解决这两个问题,mysql中有系统变量作用范围的概念。具体来说,作用范围分为两种:

  • GLOBAL:全局变量,影响服务器的整体操作
  • SESSION:会话变量,影响某个客户端连接的操作(注:session有个别名叫做LOCAL)

在服务器启动时,会将每个全局变量初始化为其默认值(可以通过命令行或选项文件中指 定的选项更改这些默认值)。然后服务器还为每个连接的客户端维护一组会话变量,客户 端的会话变量在连接时使用相应全局变量的当前值初始化。这话有点儿绕,还是以 default_storage_engine 举例,在服务器启动时会初始化一个名为 default_storage_engine ,作用范围为 GLOBAL 的系统变量。之后每当有一个客户端连接到

该服务器时,服务器都会单独为该客户端分配一个名为 default_storage_engine ,作用范 围为 SESSION 的系统变量,该作用范围为 SESSION 的系统变量值按照当前作用范围为GLOBAL 的同名系统变量值进行初始化。

很显然,通过启动选项设置的系统变量的作用范围都是 GLOBAL 的,也就是对所有客户端都有效的,因为在系统启动的时候还没有客户端程序连接进来呢。
注意:

并不是所有系统变量都具有 GLOBAL 和 SESSION 的作用范围。

  • 有一些系统变量只具有 GLOBAL 作用范围,比方说 max_connections ,表示服务器程序支持同时最多有多少个客户端程序进行连接。
  • 有一些系统变量只具有 SESSION 作用范围,比如 insert_id ,表示在对某个包含AUTO_INCREMENT 列的表进行插入时,该列初始的值。

  • 有一些系统变量的值既具有 GLOBAL 作用范围,也具有 SESSION 作用范围,比如我 们前边用到的 default_storage_engine ,而且其实大部分的系统变量都是这样 的,

有些系统变量是只读的,并不能设置值。

  • 比方说 version ,表示当前 MySQL 的版本,我们客户端是不能设置它的值的,只能在SHOW VARIABLES 语句里查看。