
今天有非常好心的朋友跟我提建议,说我的文章内容还不错,就是太长了,不利于公众号涨粉,毕竟人们都是用手机观看,太长了人们不愿意看。在这我先谢谢这位朋友,不过我写的不是鸡汤,不是外边那些妖艳贱货公众号发的水文,每一篇文章都是我苦思冥想,改了又改,只为大家读的时候可以轻松点,再轻松一点,但是文章核心要表达的东西却没有少一点,反而比教科书或者某些畅销技术书籍的内容更详细,因为要表达清楚这么多东西用很少的篇幅是不可能做到的,每一篇文章都是一个体系,而不是一个很简单的知识点。所以大家对待我的文章也不应该抱着随便看看的想法,这些文章是我看了n本阅读体验巨不好的书的精华,如果你想升职加薪,恰巧又不会这些内容,那正好,坐下来打开你的电脑,认认真真看一会儿吧。这世道缺的是认真做事儿的人,从不缺想坐在家里一夜暴富,走上人生巅峰的人。下边的阅读建议请认真观看:
1. 最好使用电脑观看。
2. 如果你非要使用手机观看,那请把字体调整到最小,这样观看效果会好一些。
3. 碎片化阅读并不会得到真正的知识提升,要想有提升还得找张书桌认认真真看一会书,或者我们公众号的文章。
4. 如果觉得不错,各位帮着转发转发,如果觉得有问题或者写的哪不清晰,务必私聊我~
5. 这篇文章需要前边的一篇文章为基础,如果你没看过,最好看一下:MySQL命令执行过程和存储引擎概述。
回顾一下过去
之前我们唠叨过MySQL
服务器程序是如何处理客户端程序发送过来的请求,这里是文章链接:MySQL命令执行过程和存储引擎概述。我们唠叨了包括连接管理、解析与优化、存储引擎的处理。我们把负责对底层表进行提取和写入工作的存储引擎多唠叨了几句,并且介绍了一堆MySQL
服务器程序支持的存储引擎,当然大家没必要记住,我们在后边的章节里会慢慢向大家渗透存储引擎的各项功能的。
真实开发过程中一般有两拨人使用到数据库,一拨是开发(英文简称RD
),他们主要是根据自己的业务情况去创建对应的表,然后用他们的开发语言,比如C、Java、Php啥的去对表进行增删改查操作;另一拨是运维(英文简称OP
),他们负责MySQL服务器的安装与维护,比如为不同的用户分配用户名和密码,启动和关闭服务器,设置服务器的参数啥的。我们前边唠叨的大部分都是从RD
的角度去看MySQL
怎么使用,本集主要从OP
的角度来看看怎么管理MySQL
。
MySQL服务器程序的启动和关闭
之前我们对于MySQL服务器程序的启动和关闭只是大致提了一下,下边我们详细来看各种启动和关闭方式。
Unix里启动服务器程序
如果你使用的操作系统是类Unix
系统,那么在MySQL
安装目录下的bin
目录下,有一些列可执行文件,因为这个目录下的文件太多,我们列出一部分来看一下:
.
.
├── mysql
├── mysql.server -> ../support-files/mysql.server
├── mysqladmin
├── mysqlbinlog
├── mysqlcheck
├── mysqld
├── mysqld_multi
├── mysqld_safe
├── mysqldump
├── mysqlimport
├── mysqlpump
... (省略其他文件)
0 directories, 40 files
其中的一些可执行文件是用来启动MySQL
服务器程序的,我们一一来看。
mysqld
我们知道MySQL
服务器程序的进程名称就是mysqld
,运行这个可执行文件会直接启动MySQL
服务器程序。但这个命令不常用,我们继续往下看更牛逼的启动命令。
mysql_safe
运行mysql_safe
不仅可以启动MySQL
服务器程序,而且启动另外一个监控进程,在MySQL
服务器程序挂了的时候,可以帮助重启它。另外,使用mysql_safe
启动服务器程序时,它会将服务器程序的出错信息和其他诊断信息重定向到某个文件中,产生出错日志,我们之后在说日志管理的时候会详细说这些错误日志。
mysql.server
mysql.server
只是对mysql_safe
的一个封装,在调用mysql.server
时需要在后边指定start
参数,就像这样:
mysql.server start
它会间接的调用mysql_safe
去启动服务器程序。不过需要注意的是,这个 mysql.server 文件其实是一个链接,它的实际文件在 ../support-files/ 目录下。
mysql_multi
其实我们一台计算机上也可以运行多个MySQL
实例,也就是运行多个MySQL
服务器程序。如果想运行多个的话,就需要使用到mysql_multi
了,这个命令的使用比较复杂,我们在后边的章节中会详细来唠叨它。
Windows里运行服务器程序
Windows分为两种启动方式,分别是手动启动和以服务的形式启动,下边我们详细看。
mysqld
同样的,在MySQL
安装目录下的bin
目录下有一个mysqld
可执行文件,在黑框框里,或者直接双击运行它就算启动了MySQL
服务器程序了。
以服务的方式运行服务器程序
啥是个Windows 服务
?如果无论是谁正在使用这台计算机,我们都需要长时间的运行某个程序,而且需要在计算机启动的时候便启动它,一般我们都会把它注册为一个Windows 服务
,操作系统会帮我们管理它。
把某个程序程序注册为Windows服务的方式挺简单,如下:
"完整的可执行文件路径" --install[-manual] [服务名]
其中的-manual
可以省略,加上它的话表示在Windows系统启动的时候不自动启动该服务,否则会自动启动。服务名
也可以省略,默认的服务名就是MySQL
。比如我的Windows计算机上mysqld
的完整路径是:
C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld
所以如果我们想把它注册为服务的话可以这么写:
"C:\Program Files\MySQL\MySQL Server 5.7in\mysqld" --install
在把mysqld
注册为Windows 服务之后,我们就可以通过下边这个命令来启动MySQL
服务器程序了:
net start MySQL
当然,如果你喜欢图形界面的话,你可以通过Windows的服务管理器通过用鼠标点点点的方式来启动和停止服务(作为一个程序猿,还是用黑框框吧~)。
删除服务也很简单:
C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld --remove [服务名]
如果我们之前在注册服务的时候就指定过服务名,那删除的时候也需要指定,否则它会删除服务名为MySQL
的那个服务。
停止服务器
在安装服务器的主机上直接关闭
如果你运行的是类Unix
系统,可以使用这种方式关闭服务器程序:
mysql.server stop
如果你使用的是Windows
系统,并且将mysqld
注册为Windows服务的话,可以使用这种方式关闭服务器程序:
net stop MySQL
通过客户端关闭
如果你拥有超级管理员权限,可以直接发送这个命令来关闭MySQL
服务器程序:
mysql> shutdown;
或者在MySQL
安装目录的bin
目录下有一个mysqladmin
可执行文件,可以运行这个命令来关闭服务器:
mysqladmin -h [主机名] -u [用户名] -p shutdown;
关于什么是超级管理员权限我们之后会有专门的章节来叙述,现在你知道root用户有超级管理员权限就好了。
指定服务器程序启动选项
如果你用过手机,你的手机上一定有一个设置的功能,你可以选择设置手机的来电铃声、设置音量大小、设置解锁密码等等。假如没有这些设置功能,我们的生活将置于尴尬的境地,比如在图书馆里无法把手机设置为静音,无法把流量开关关掉以节省流量,在别人得知解锁密码后无法更改密码~
MySQL
服务器程序也是一样,我们也可以对它提供的某些功能进行设置以便在各种场景下更好的使用,比如指定客户端和服务器通信方式、设置允许同时连入的客户端数量、表的默认存储引擎、查询缓存的大小吧啦吧啦,我们下边将要展示两种在启动服务器程序时候设置它们的方式,所以这些设置项也可以被称作启动选项
。
需要注意的一点事,MySQL中的设置项十分多,我们现在要唠叨的是设置它们的方式,下边可能会出现一些我们不认识的设置项,先不用去纠结每个设置项具体的作用是啥,之后我们会对一些重要的设置项详细唠叨。如果你想了解完整的设置项内容,可以参看MySQL的官方文档:https://dev.mysql.com/doc/refman/5.7/en/mysqld-option-tables.html
命令行中设置
因为我的客户端程序和服务器程序都装在一台计算机上,所以使用客户端程序连接服务器程序时指定的主机名可以是127.0.0.1
,这样它们之间会用TCP/IP
网络的方式建立连接,如果我们想禁止使用IP
地址的客户端程序连接服务器程序,可以在启动服务器程序的命令行里添加skip-networking
启动选项,就像这样:
mysql.server start --skip-networking
如果我们使用这个命令启动服务器程序的话,我们再把主机名指定为127.0.0.1
的话会显示连接失败:
mysql -h127.0.0.1 -uroot -p
Enter password:
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (61)
wangqinengdeMBP:/ wangqingfeng$
这就意味着我们指定的启动选项生效了!
再举一个例子,我们前边说过如果在创建表的语句中没有显式指定表的存储引擎的话,那就会默认使用InnoDB
作为表的存储引擎。如果我们想改变表的默认存储引擎的话,可以这样写启动服务器的命令行:
mysql.server start --default-storage-engine=MyISAM
我们现在把表的默认存储引擎改为MyISAM
,在客户端程序连接到服务器程序后试着创建一个表:
mysql> CREATE TABLE sys_var_demo(
-> i INT
-> );
Query OK, 0 rows affected (0.02 sec)
这个定义语句中我们并没有明确指定表的存储引擎,创建成功后再看一下这个表的结构:
mysql> SHOW CREATE TABLE sys_var_demo\G
*************************** 1. row ***************************
Table: sys_var_demo
Create Table: CREATE TABLE `sys_var_demo` (
`i` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
mysql>
可以看到该表的存储引擎已经变为MyISAM
了,说明启动选项生效了。
所以在启动服务器程序的命令行后边指定启动选项的通用格式就是这样的:
--启动选项1[=值1] --启动选项1[=值2] ... --启动选项n[=值n]
对于不需要值的启动选项,比方说--skip-networking
,它们就不需要指定对应的值。对于需要指定值的启动选项,比如--default-storage-engine
我们在指定这个设置项的时候需要显式的指定它的值,比方说InnoDB
、MyISAM
啦什么的~
在启动服务器程序命令行中指定设置项时需要注意下边这几点:
在设置项前需要加
--
前缀。如果想同时设置多个系统变量的话,可以用空格隔开。
配置文件中设置
在启动服务器程序命令行中设置启动选项只对当次生效,也就是说如果下一次重启服务器程序的时候我们还想保留这些启动选项的话,还得重复把这些选项写到启动命令行中,这样真的神烦唉!于是设计MySQL
的大叔们提出一种配置文件
的概念,我们把需要设置的启动选项都写在这个配置文件中,每次启动服务器的时候都从这个文件里加载相应的启动选项。由于这个配置文件可以长久的保存在计算机的硬盘里,所以只需我们配置一次,以后就都不用显式的把启动选项都写在启动命令行中了,所以我们推荐使用配置文件的方式来设置启动选项。
配置文件的路径
ennnnm~ 所以配置文件在哪呢?
类Unix操作系统通常在
/etc/my.cnf
。Windows操作系统通常在
C:\my.ini
。
但是这只是非常标准的位置,不同版本的MySQL
可能还有好多不同的配置文件路径。如果想弄清楚你的系统里配置文件的位置,可以运行下边这个命令:
mysqld --verbose --help
这个命令的输出内容太多了,我们其实只需要看前几行,所以用more
来限制一下输出长度:
mysqld --verbose --help | more
这个命令的输出语句中的前几行就标明了配置文件的位置,比方说我计算机中的执行结果就是这样:

可以看到圈出来的这些路径都可以当作配置文件:
/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/etc/my.cnf
~/.my.cnf
这也就是说,在我的计算机中这几个路径中的任意一个都可以当作配置文件来使用,如果它们不存在,你可以手动创建一个,比方说我手动在~/.my.cnf
这个路径下创建一个配置文件。
需要注意的是,不同操作系统、不同版本的MySQL中的配置文件路径可能是不一样的,所以一定要运行一下mysqld --verbose --help
来查看一下当前计算机中的配置文件路径。
小贴士:
`~`在Unix系统中代表用户目录,如果你没听说过的话就需要去看些关于Unix或者Linux系统操作的书籍了。
什么?那些书写的都太枯燥,看不下去?等我~
配置文件的内容
现在配置文件是有了,里边填什么内容呢?我们来看一下配置文件中内容的格式:
配置文件中的内容被分为若干个组,每个组有一个组名,用中括号
[]
扩起来,就像这样:[mysqld]
(具体的配置内容...)
[server]
(具体的配置内容...)
[mysql_safe]
(具体的配置内容...)
[mysql.server]
(具体的配置内容...)
[client]
(具体的配置内容...)像这个配置文件里就定义了五个组,组名分别是
mysqld
、server
、mysql_safe
、mysql.server
、client
。每个组下边可以定义若干个启动选项,每个启动选项不允许加
--
前缀,并且每行只指定一个选项,就像这样:[mysqld]
xxx1=vvv1
xxx2=vvv2
...
[server]
xxx1=vvv1
xxx2=vvv2
...
[mysql_safe]
xxx1=vvv1
xxx2=vvv2
...
[mysql.server]
xxx1=vvv1
xxx2=vvv2
...
[client]
xxx1=vvv1
xxx2=vvv2
...我们可以用
#
来标记注释内容,如下:# 这是注释
需要注意的是,不同的启动命令可以读取配置文件中不同的组,比方说下边这三个命令能读取的组的情况如下:
启动命令 | 能读取的组 |
---|---|
mysqld | [mysqld] 、 [server] |
mysqld_safe | [mysqld] 、 [server] 、 [mysqld_safe] |
mysql.server | [mysqld] 、 [server] 、 [mysqld_safe] 、 [mysql.server] |
以mysql.server
命令为例,如果我们想用这个命令来启动服务器程序的话,那我们把启动选项放置到[mysqld]
、[server]
、[mysqld_safe]
、[mysql.server]
这几个中的任何一个都可以起作用,现在我们修改一下~/.my.cnf
这个配置文件的内容:
[server]
skip-networking
default-storage-engine=MyISAM
然后直接用mysql.server
启动服务器程序:
mysql.server start
虽然在命令行没有添加启动选项,但是在程序启动的时候,就会默认的到我们的~/.my.cnf
配置文件中查找启动选项,又由于mysql.server
命令可以读取[server]
选项组的内容,所以skip-networking
和default-storage-engine=MyISAM
这两个选项是生效的。
你可以把这些启动选项放在[client]
组里再试试用mysql.server start
启动服务器程序,看一下里边的启动选项生效不。
客户端程序使用的选项组
不止服务器程序启动的时候可以读取配置文件,客户端程序启动的时候也可以读取同样的配置文件,但是读取的选项组不同。比方说使用mysql
命令启动客户端程序时会读取配置文件的[client]
或者[mysql]
组中的选项,比方说我们修改一下刚才的配置文件,把主机、用户名、密码等信息填到[client]
组下边:
[server]
skip-networking
default-storage-engine=MyISAM
[client]
host=localhost
user=root
password=123456
这样我们再启动客户端程序的时候,就不用使用mysql -h -u -p
这样的形式了,直接写mysql
就好了。
特定MySQL版本的专用选项组
我们可以在选项组的名称后加上特定的MySQL
版本号,比如对于[mysqld]
选项组来说,我们可以定义一个[mysqld-5.7]
的选项组,它的含义和[mysqld]
一样,只不过别的版本的MySQL
无法读取这个选项组下的启动选项。
配置文件的优先级
我们可以在多个路径下定义多个配置文件,通过使用mysqld --verbose --help
命令可以查看到各个配置文件的路径,我的电脑上各个配置文件的顺序如下:
/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/etc/my.cnf
~/.my.cnf
MySQL
将按照给定的顺序依次读取各个配置文件,如果该文件不存在则忽略。
值得注意的是,如果我们在多个配置文件中设置了相同的启动选项,那以最后一个配置文件中的为准。比方说/etc/my.cnf
文件的内容是这样的:
[server]
default-storage-engine=InnoDB
而~/.my.cnf
文件中的内容是这样的:
[server]
default-storage-engine=MyISAM
又因为~/.my.cnf
比/etc/my.cnf
靠后,所以如果两个配置文件中出现相同的启动选项,以~/.my.cnf
中的为准,所以default-storage-engine
的值就是MyISAM
。
同一个配置文件中多个组的优先级
我们说同一个命令可以访问配置文件中的多个组,比如mysqld
可以访问[mysqld]
、[server]
组,如果在同一个配置文件中,比如~/.my.cnf
,在这些组里出现了同样的配置项,比如这样:
[server]
default-storage-engine=InnoDB
[mysqld]
default-storage-engine=MyISAM
那么,将以最后一个出现的组中的启动选项为准,比方说例子中default-storage-engine
既出现在[mysqld]
组也出现在[server]
组,因为[mysqld]
组在[server]
组后边,就以[mysqld]
组中的配置项为准。
命令行和配置文件的优先级
如果同一个启动选项既出现在命令行中,又出现在配置文件中,那么以命令行中的启动选项为准!比如我们在配置文件中写了:
[server]
default-storage-engine=InnoDB
而我们的启动命令是:
mysql.server start --default-storage-engine=MyISAM
那最后default-storage-engine
的值就是MyISAM
!
系统变量
自定义变量回顾
我们之前介绍过如何在MySQL
中自定义变量,我想其中有一项你一定印象深刻,那就是自定义变量名前边必须加一个@
前缀,比如这样:
mysql> SET @a = 1;
Query OK, 0 rows affected (0.00 sec)
mysql>
然后我们就可以把这个变量用到别的表达式里了,比如这样:
mysql> SELECT @a;
+------+
| @a |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql>
系统变量简介
除了我们的自定义变量,其实MySQL
服务器程序自身就维护了非常多的变量,这些变量也被称为系统变量
。每个系统变量
都代表服务器程序的一个设置项,比如允许同时连入的客户端数量用系统变量max_connections
表示,表的默认存储引擎用系统变量default_storage_engine
表示,查询缓存的大小用系统变量query_cache_size
表示,MySQL
服务器程序的设置项有好几百条,我们就不一一列举了,后边碰到的时候会详细唠叨的。所有的系统变量
都有一个默认值,如果我们不显式指定这些系统变量
的话,那服务器程序运行的时候会采用这些默认值。
查看系统变量
我们也可以查看一些这些系统变量的值,命令如下:
SHOW VARIABLES [LIKE 匹配的模式];
由于系统变量
实在太多了,如果我们直接使用SHOW VARIABLES
查看的话就直接刷屏了,所以通常都会带一个LIKE
过滤条件来查看我们需要的系统变量的值,比方说这么写:
mysql> SHOW VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.01 sec)
mysql> SHOW VARIABLES like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql>
可以看到,现在服务器程序使用的默认存储引擎就是InnoDB
,允许同时连接的客户端数量最多为151
。别忘了LIKE
表达式后边可以跟通配符来进行模糊查询,也就是说我们可以这么写:
mysql> SHOW VARIABLES LIKE 'default%';
+-------------------------------+-----------------------+
| Variable_name | Value |
+-------------------------------+-----------------------+
| default_authentication_plugin | mysql_native_password |
| default_password_lifetime | 0 |
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| default_week_format | 0 |
+-------------------------------+-----------------------+
5 rows in set (0.01 sec)
mysql>
这样就查出了所有以default
开头的系统变量的值。
设置系统变量
通过启动选项设置
大部分的系统变量
都可以通过启动服务器时传送启动选项的方式来进行设置。如何填写启动选项我们上边已经花了大篇幅来唠叨了,就是下边两种方式:
通过命令行添加启动选项。
比方说我们在启动服务器程序时用这个命令:
mysql.server start --default-storage-engine=MyISAM --max-connections=10
通过配置文件添加启动选项。
我们可以这样填写配置文件:
[server]
default-storage-engine=MyISAM
max-connections=10
当使用上边两种方式中的任意一种启动服务器程序后,我们再来查看一下系统变量的值:
mysql> SHOW VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | MyISAM |
+------------------------+--------+
1 row in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 10 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql>
可以看到default_storage_engine
和max_connections
这两个系统变量的值已经被修改了。
不知道大家注意没有,对于表示表的默认存储引擎的default_storage_engine
系统变量来说,这个名称中各个单词之间是使用下划线_
来分隔的,填写的启动选项名却是default-storage-engine
,各个单词是用中划线-
分隔的,这里头有啥讲究没?
其实没啥讲究,我们也可以使用下划线分隔的形式来表示启动选项,比方说写成这样:
mysql.server start --default_storage_engine=MyISAM --max_connections=10
在启动选项中使用中划线-
,在系统变量中使用下划线_
,只是一种历史习惯,在启动选项中其实也可以下划线_
。如果有系统变量名和启动选项不能通用的情况,我们之后如果遇到了会强调的!
服务器程序运行中设置
系统变量
比较牛逼的一点就是,对于大部分系统变量来说,它们的值可以在服务器程序运行过程中通过客户端程序进行修改,从而动态的对服务器程序的某些功能进行设置。
设置不同作用范围的系统变量
我们前边说过,多个客户端程序可以同时连接到一个服务器程序,如果一个客户端修改了某个系统变量
的值,比如修改了default_storage_engine
这个系统变量的值,那其他客户端程序建表的时候默认的存储引擎也会改变么?答案是我们有时候希望只对本客户端起作用,有时候又希望对所有的客户端起作用,那咋办?
所以设计MySQL
的大叔们提出了一个系统变量作用范围
的概念,这个作用范围
分两种:
GLOBAL
:对所有客户端都有效。SESSION
:只对本客户端有效。(注:SESSION
有个别名叫LOCAL
)
很显然,通过启动选项设置的系统变量的作用范围都是GLOBAL
的,也就是对所有客户端都有效的,因为在系统启动的时候还没有客户端程序连接进来呢。
在服务器程序运行期间通过客户端程序设置系统变量的完整语法就是这样:
SET [GLOBAL|SESSION] 系统变量名 = 值;
或者写成这样也行:
SET [@@(GLOBAL|SESSION).]var_name = XXX;
比如我们想在服务器运行过程中把default_storage_engine
这个系统变量的值修改为MyISAM
,并且想让修改后的结果对所有客户端都生效,也就是说其他客户端建表的时候都用MyISAM
作为默认的存储引擎,那我们可以选择下边两条语句中的任意一条来进行设置:
语句一:SET GLOBAL default_storage_engine = MyISAM;
语句二:SET @@GLOBAL.default_storage_engine = MyISAM;
如果只想对本客户端生效,也可以选择下边三条语句中的任意一条来进行设置:
语句一:SET SESSION default_storage_engine = MyISAM;
语句二:SET @@SESSION.default_storage_engine = MyISAM;
语句三:SET default_storage_engine = MyISAM;
从上边的语句三
也可以看出,如果在设置系统变量的语句中省略了作用范围,默认的作用范围就是SESSION
。也就是说SET xxx = vvv
和SET SESSION xxx = vvv
是等价的。
查看不同作用范围的系统变量
既然系统变量
有作用范围
之分,那我们的SHOW VARIABLES
语句查看的是什么作用范围
的系统变量
呢?
答:默认查看的是SESSION
作用范围的系统变量。
当然我们也可以在查看系统变量的语句上加上要查看哪个作用范围
的系统变量,就像这样:
SHOW [GLOBAL|SESSION] VARIABLES [LIKE 匹配的模式];
下边我们演示一下完整的设置并查看系统变量的过程:
mysql> SHOW SESSION VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.00 sec)
mysql> SHOW GLOBAL VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.00 sec)
mysql> SET SESSION default_storage_engine = MyISAM;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW SESSION VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | MyISAM |
+------------------------+--------+
1 row in set (0.00 sec)
mysql> SHOW GLOBAL VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.00 sec)
mysql>
可以看到,最初default_storage_engine
的系统变量无论是在GLOBAL
作用范围上还是在SESSION
作用范围上的值都是InnoDB
,我们在SESSION
作用范围把它的值设置为MyISAM
之后,可以看到GLOBAL
作用范围的值并没有改变。
小贴士:
如果某个客户端改变了某个系统变量在`GLOBAL`作用范围的值,那它会对所有客户端起作用,包括它自己,所以该系统变量在`SESSION`作用范围的值也会被改变。
注意事项
并不是所有系统变量都具有
GLOBAL
和SESSION
的作用范围。有一些系统变量只具有
GLOBAL
作用范围,比方说max_connections
,表示服务器程序支持同时最多有多少个客户端程序进行连接。有一些系统变量只具有
SESSION
作用范围,比如insert_id
,表示插入值时使用的AUTO_INCREMENT
修饰的列的值。有一些系统变量的值既具有
GLOBAL
作用范围,也具有SESSION
作用范围,比如我们前边用到的default_storage_engine
,而且其实大部分的系统变量都是这样的,有些系统变量是只读的,并不能设置值。
比方说
version
,表示当前MySQL
的版本,我们客户端是不能设置它的值的,只能在SHOW VARIABLES
语句里查看。
启动选项和系统变量的区别
启动选项
是在服务器程序启动时我们程序员传递的一些参数,而系统变量
是服务器程序里维护的一些变量。
大部分的系统变量都可以被当作启动选项传入。
有些系统变量是不可以当作启动选项来设置,比如
auto_increment_offset
、character_set_client
啥的。有些启动选项也不是系统变量,比如
enable-named-pipe
如果你现在就有兴趣查看更多的启动选项和系统变量,那你可以去访问一下MySQL的官方文档:https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
不过我觉得你应该不会有兴趣的~
状态变量
为了让我们更好的了解服务器程序的运行情况,MySQL
服务器程序中维护了好多关于程序运行状态的变量,它们被称为状态变量
。比方说Threads_connected
表示当前有多少客户端与服务器建立了连接,Handler_update
表示已经更新了多少行记录吧啦吧啦,像这样显示服务器程序状态信息的状态变量
还有好几百个,我们就不一一唠叨了,等遇到了会详细说它们的作用的。
由于状态变量
是用来显示服务器程序运行状况的,所以它们的值只能由服务器程序自己来设置,我们程序猿是不能设置的。与系统变量
类似,状态变量
也有GLOBAL
和SESSION
两个作用范围的,所以查看状态变量
的语句可以这么写:
SHOW [GLOBAL|SESSION] STATUS [LIKE 匹配的模式];
类似的,如果我们不写明作用范围,默认的作用范围是SESSION
,比方说这样:
mysql> SHOW STATUS LIKE 'thread%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_cached | 0 |
| Threads_connected | 1 |
| Threads_created | 1 |
| Threads_running | 1 |
+-------------------+-------+
4 rows in set (0.00 sec)
mysql>
所有以thread
开头的SESSION
作用范围的状态变量就都被展示出来了。
总结
MySQL服务器程序在类Unix系统的启动方式:
mysqld
mysql_safe
mysql.server
mysql_multi
MySQL服务器程序在Windows系统的启动方式:
mysqld
以服务的方式启动:
net start MySQL
在服务器端关闭服务器程序:
类Unix系统的关闭方式:
mysql.server stop
Windows系统的以服务的方式关闭:
net stop MySQL
在客户端关闭服务器程序:
通过语句关闭:
mysql> shutdown;
通过
mysqladmin
命令关闭mysqladmin -h [主机名] -u [用户名] -p shutdown;
启动选项是在服务器程序启动时我们程序员传递的一些参数,添加启动选项的方式:
命令行中添加
配置文件中添加
系统变量是服务器程序里维护的一些变量,这些变量影响着服务器的行为。修改系统变量的方式:
通过添加启动选项修改
运行时通过
SET
语句修改,下边两种方式都可以:SET [GLOBAL|SESSION] 系统变量名 = 值;
SET [@@(GLOBAL|SESSION).]var_name = XXX;其中的作用范围的意思如下:
GLOBAL
:对所有客户端都有效。SESSION
:只对本客户端有效。查看系统变量的方式:
SHOW [GLOBAL|SESSION] VARIABLES [LIKE 匹配的模式];
状态变量是用来显示服务器程序运行状况的,我们只能查看,查看方式是:
SHOW [GLOBAL|SESSION] STATUS [LIKE 匹配的模式];
写文章最大的寂寞就是写了没人看,动动手指关注转发,后续还有更多纯纯的干货。