《MySQL是怎样运行的》总结二

466 阅读7分钟

第二章、启动选项和系统变量

前言:文章是根据《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%命令来查看。
image-20210923172819295
  • 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文件的内容,可以看到确实是按照上面这种形式写入的,这也就是系统启动后的相关配置。

image-20210923193643639

还可以设置特定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 匹配的条件];
image-20210923213702493