第二章、启动选项和系统变量
前言:文章是根据《MySQL是怎样运行的:从根儿上理解 MySQL》这本书整理而来,作者小孩子4919。第一章介绍了MySQL服务器和客户端的知识,包括它们的连接、请求解析过程等。第二章将介绍系统的配置,正如电脑、手机等都有对系统配置的设置和修改,MySQL服务器和客户端也有很多系统配置,了解这些配置可以让我们更好的使用MySQL应用。
第一节、启动选项和配置文件
先举一些MySQL的例子,解释一下系统变量都能修改什么:比如MySQL服务器可以设置允许同时连接的客户端数量、客户端和服务器的通信方式、表的默认存储引擎、查询缓存的大小等等,而MySQL客户端像ip地址、用户名、密码等信息也都可以设置。
MySQL可以在命令行中设置,也可以在配置文件中设置,在命令行中设置只在当前这次有用,当我们关闭连接或窗口,配置就失效了,配置文件则是可以设置成一直都生效的状态。
1、命令行上使用选项
禁止tcp/ip协议
比如我们想在启动服务器的时候就禁止tcp/ip通信,那么可以使用如下指令(这两个都行):
mysqld --skip_networking
mysqld --skip-networking
上面这个也说明,完整的选项需要使用--来连接,对于多个词组成的选项,中间使用“-”和“_”没什么区别。
这样再使用下面指令就会报错了(因为使用ip地址就意味着要用到tcp/ip协议):
mysql -h127.0.0.1 -uroot -p
设置默认的存储引擎
我们可以修改默认的存储引擎:
mysql --default-storage-engine=存储引擎名;
上面这种设置了有值的=两边不能空格,空格会报错。
那么在命令行上设置选项的默认语法就是:
#语法
--启动选项1【=值1】 --启动选项2【=值2】 --启动选项3【=值3】......
一般的选项都是长形式的(词汇都比较长),当然常用的也有短形式(简化词汇的):
| 长形式 | 短形式 | 含义 |
|---|---|---|
| --host | -h | 主机名 |
| --user | -u | 用户名 |
| --password | -p | 密码 |
| --port | -P | 端口号 |
| --version | -V | 版本信息 |
2、配置文件中使用选项
(1)配置文件的路径
这里主要看的是windows系统,顺序如下:
| 路径名 | 备注 |
|---|---|
| %WINDIR%\my.ini,%WINDIR%\my.cnf | |
| C:\my.ini,C:\my.cnf | |
| BASEDIR\my.ini,BASEDIR\my.cnf | |
| default-extra-file | 命令行指定的额外配置文件路径 |
| %APPDATA%\MYSQL.mylogin.cnf | 登录路径选项(仅限客户端) |
- 前三个路径中,配置文件既可以使用.ini的扩展名,也可以使用.cnf的扩展名。
- %WINDIR%一般指的是机器上Windows的目录,一般是指C:\WINDOWS,或者使用echo %WINDIR%命令来查看。
- BASEDIR是指MySQL的安装目录的路径,我这里是:
C:\Program Files\MySQL\MySQL Server 5.5
- 第四个路径是指启动程序中可以指定default-extra-file值来添加额外的配置文件路径,比如想添加可以这么写:
mysqld --default-extra-file=C:\Users\xxx\my_extra_file.txt
这样MySQL启动后就会去这个C:\Users\xxx\my_extra_file.txt路径下找文件。
- %APPDATA%表示Windows应用程序数据目录的值
(2)配置文件的内容
配置文件已经分好了组,每个组有一个组名,用中括号括起来。
#具体的情况如下:
[server]
[具体的启动选项...]
[mysqld]
[具体的启动选项...]
[mysqld_safe]
[具体的启动选项...]
[client]
[具体的启动选项...]
[mysql]
[具体的启动选项...]
[mysqladmin]
[具体的启动选项...]
每个分组中国都可以设置若干启动项。
#比如下面这个
[server]
option1 #这种不需要选项值
option2 = value2 #这是有选项值的情况
下面截取了部分my.ini文件的内容,可以看到确实是按照上面这种形式写入的,这也就是系统启动后的相关配置。
还可以设置特定mysql版本号,让只有版本号为这个版本的程序才去执行这个选项组:
#比如下面这个就是指定只有5.7版本的mysqld程序才执行这个版本
[mysqld-5.7]
option1 #这种不需要选项值
option2 = value2 #这是有选项值的情况
(3)执行顺序
会按照上面这个表的顺序排列,如果有相同的启动选项,以最后的配置文件为准。
而同一个文件,也是按照最下面的执行,比如两个组都设置了存储引擎,那么server在mysqld上面,那么执行的就是mysqld。
如果配置文件也指定了,后面也在命令行中设置好了,是要以命令行的为准,因为这些临时性的更能反映当前用户的需求。
(4)defaults-file的使用
我们可能设置了很多配置文件,如果我们新写了一份配置文件,不想让mysql再去以前配置的文件下扫描,那么可以使用defaults-file设置:
mysqld --defaults-file=/tmp/myconfig.txt
那么程序只会去上面这个/tmp/myconfig.txt文件处去搜索。
defaults-file不会搜索默认的配置文件,而前面表格里的default-extra-file除了搜索当前的file,还是要去设置好的路径下搜索。
第二节、系统变量
1、简介
系统变量是可以影响当前程序行为的变量,比如最大连接数、默认存储引擎、缓存大小等,MySQL系统变量就有几百个,而大多数的系统变量的值可以再程序允许期间被修改,而不需要停止并且重启服务器。
2、查看系统变量
show variables [like 匹配的模式]
3、设置系统变量
- 在启动选项设置
绝大多数系统变量都可以通过启动选项设置,前面已经介绍过了:命令行设置、配置文件设置。
- 服务器运行时设置
系统变量是有作用范围的,比如不同的数据库、表,存储引擎可能不同。绝大多数变量都是可以用于全局、也可以用于某个线程,不过也有少部分是单纯用于全局的,比如最大连接数、查询缓存大小等。
系统变量的范围有全局范围(global)、会话范围(session);服务器在启动时,会给每个全局变量初始化默认值,每连接一个客户端,服务器还会维护一组会话变量,让这个变量的值编程会话变量的值。
怎么设置系统变量呢?可以采用如下语法:
set 【global|session】系统变量名 = 值;
#或
set [@@(global|session).]系统变量名 = 值;
注意:
- 并不是所有的系统变量都有global和session的作用范围
- 比如max_connections(最大连接数)等系统变量就只有global作用范围
- 比如insert_id等系统变量就只有session作用范围
- 有的系统变量为只读,不能修改,比如version
启动选项和系统变量有什么区别呢?
大部分的启动选项和系统变量是差不多的,但是有一部分系统变量是不能作为启动选项设置的,比如character_set_client,有些启动选项也不是系统变量,比如defaults-file。
第三节、状态变量
状态变量是显示服务器程序的运行状态的,是不能进行认为设置的,是服务器自己设置完显示给我们的(为了我们能够更好的了解服务器的运行情况)。比如:Threads_connected表示当前有几个客户端连接到服务器;Innodb_rows_updated表示更新了多少条以Innodb成为存储引擎的表中的记录等等。
这种状态变量使用如下语法进行查看:
show [global|session] status [like 匹配的条件];