系统中的变量
# 系统中的变量
# 命令行上使用选项
MySql的服务端在运行的时候,对于一些属性有默认值,比方说服务器允许同时连入的客户端的默认数量是151
,表的默认存储引擎是InnoDB
。我们可以在程序启动时(客户端链接服务端的时候)去修改这些默认值,或者在对应的配置文件中进行修改,当然他们中的大多数变量也可在程序运行过程中修改,它们称之为启动选项(startup options)。
需要注意的是,在命令行中设置启动选项只对当次启动生效,也就是说如果下一次重启程序的时候如果没有这些设置,启动选项又会恢复默认值。如果想一直生效,则需要对配置文件进行修改。
比如修改表的默认存储引擎为MyIsam,如下:
mysqld --default-storage-engine=MyISAM
在启动服务器程序的命令行后边指定启动选项的通用格式就是这样的:
--启动选项1[=值1] --启动选项2[=值2] ... --启动选项n[=值n]
提示:我们在命令行中指定启动选项时需要在选项名前加上
--
前缀。另外,如果选项名是由多个单词构成的,它们之间可以由短划线-
连接起来,也可以使用下划线_
连接起来,也就是说default-storage-engine
和default_storage_engine
表示的含义是相同的。
# 系统变量
上面说的启动选项其实就是系统变量的一种,这些属性值在MySql服务器运行时影响着它的应为。MySQL
服务器程序的系统变量有好几百条。每个系统变量都有一个默认值,我们可以使用命令行或者配置文件中的选项在启动服务器时改变一些系统变量的值。大多数的系统变量的值也可以在程序运行过程中修改,而无需停止并重新启动它。
查看系统变量:
SHOW VARIABLES [LIKE 匹配的模式];
mysql> SHOW VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.01 sec)
2
3
4
5
6
7
# 不同的作用范围
不同人使用不同客户端链接服务器,大家都可以根据自己需求进行变量的设置,但万一冲突了,怎么办呢?
为了解决以上问题,MySql给变量设置了作用范围
这个概念。具体来说作用范围
分为这两种:
GLOBAL
:全局变量,影响服务器的整体操作。SESSION
:会话变量,影响某个客户端连接的操作。(注:SESSION
有个别名叫LOCAL
)
那么刚刚我们SHOW VARIABLES
查看的变量是那种类型呢?
默认查看的是SESSION
作用范围的系统变量。
当然我们也可以在查看系统变量的语句上加上要查看哪个作用范围
的系统变量,就像这样:
SHOW [GLOBAL|SESSION] VARIABLES [LIKE 匹配的模式];
那么通过启动项设置的变量呢?属于哪种
通过启动选项设置的系统变量的作用范围都是GLOBAL
的,也就是对所有客户端都有效的,因为在系统启动的时候还没有客户端程序连接进来呢。
# 运行时设置
在服务器程序运行期间通过客户端程序设置系统变量的语法,有两种:
SET [GLOBAL|SESSION] 系统变量名 = 值;
SET [@@(GLOBAL|SESSION).]系统变量名 = XXX;
2
3
当然如果在设置系统变量的语句中省略了作用范围,默认的作用范围就是SESSION
。
提示:如果某个客户端改变了某个系统变量在
GLOBAL
作用范围的值,并不会影响该系统变量在当前已经连接的客户端作用范围为SESSION
的值,只会影响后续连入的客户端在作用范围为SESSION
的值。
# 启动选项跟系统变量的区别
启动选项
是在程序启动时我们程序员传递的一些参数,而系统变量
是影响服务器程序运行行为的变量,它们之间的关系如下:
- 大部分的系统变量都可以被当作启动选项传入。
- 有些系统变量是在程序运行过程中自动生成的,是不可以当作启动选项来设置,比如
auto_increment_offset
、character_set_client
等。 - 有些启动选项也不是系统变量,比如
defaults-file
。
# 状态变量
为了让我们更好的了解服务器程序的运行情况,MySQL
服务器程序中维护了很多关于程序运行状态的变量,它们被称为状态变量
。比方说Threads_connected
表示当前有多少客户端与服务器建立了连接,Handler_update
表示已经更新了多少行记录等
由于状态变量
是用来显示服务器程序运行状况的,所以它们的值只能由服务器程序自己来设置,我们程序员是不能设置的。与系统变量
类似,状态变量
也有GLOBAL
和SESSION
两个作用范围的,所以查看状态变量
的语句可以这么写:
SHOW [GLOBAL|SESSION] STATUS [LIKE 匹配的模式];