第三章 MySQL数据库的体系结构_上
3.1、MySQL客户端服务器架构
客户端-服务器(Client/Server)结构简称 C/S 结构,是一种网络架构,通常在该网络架构下的软件分为客户端和服务器。MySQL是C/S架构的服务模式。
客户端和服务器程序通常不在同一台计算机上运行,比如,我们平时在当当网上买书的时候,所使用的电脑和网页浏览器就被当做了一个客户端,同时,组成当当网的电脑、数据库和应用程序就被当做服务器。
注意:客户端和服务器可以安装在两台计算机或一台计算机上,不管它们在不在相同的计算机上,客户端都要与服务器进行通信。
3.2、MySQL内部结构
MySQL 由连接池、SQL 接口、解析器、优化器、缓存、存储引擎等组成,可以分为三层,即 MySQL Server 层、存储引擎层和文件系统层。MySQL Server 层又包括连接层和 SQL 层。如下是官方文档中 MySQL 的基础架构图:
上图中,Connection pool 为连接层,Management Services & Utilities …Caches & Buffers 为 SQL 层,Pluggable Storage Engines 为存储引擎层,File system、Files & Logs 为文件系统层。Connectors 不属于以上任何一层,可以将 Connectors 理解为各种客户端、应用服务,主要指的是不同语言与 SQL 的交互。
3.2.1、连接层
应用程序通过接口(如 ODBC、JDBC)来连接 MySQL,最先连接处理的是连接层。连接层包括通信协议、线程处理、用户名密码认证 3 部分。
通信协议负责检测客户端版本是否兼容 MySQL 服务端。
线程处理是指每一个连接请求都会分配一个对应的线程,相当于一条 SQL 对应一个线程,一个线程对应一个逻辑 CPU,在多个逻辑 CPU 之间进行切换。
密码认证用来验证用户创建的账号、密码,以及 host 主机授权是否可以连接到 MySQL 服务器。
Connection Pool(连接池)属于连接层。由于每次建立连接都需要消耗很多时间,连接池的作用就是将用户连接、用户名、密码、权限校验、线程处理等需要缓存的需求缓存下来,下次可以直接用已经建立好的连接,提升服务器性能。
3.2.2、SQL层
SQL 层是 MySQL 的核心,MySQL 的核心服务都是在这层实现的。主要包含权限判断、查询缓存、解析器、预处理、查询优化器、缓存和执行计划。
权限判断可以审核用户有没有访问某个库、某个表,或者表里某行数据的权限。
查询缓存通过 Query Cache 进行操作,如果数据在 Query Cache 中,则直接返回结果给客户端,不必再进行查询解析、优化和执行等过程。
查询解析器针对 SQL 语句进行解析,判断语法是否正确。
预处理器对解析器无法解析的语义进行处理。
查询优化器对 SQL 进行改写和相应的优化,并生成最优的执行计划,就可以调用程序的 API 接口,通过存储引擎层访问数据。
Management Services & Utilities、SQL Interface、Parser、Optimizer 和 Caches & Buffers 属于 SQL 层,详细说明如下表所示。
3.2.3、存储引擎层
Pluggable Storage Engines 属于存储引擎层。存储引擎层是 MySQL 数据库区别于其他数据库最核心的一点,也是 MySQL 最具特色的一个地方。主要负责 MySQL 中数据的存储和提取。
因为在关系数据库中,数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。
3.2.4、文件系统层
文件系统层主要是将数据库的数据存储在操作系统的文件系统之上,并完成与存储引擎的交互。
3.3、MySQL目录结构
MySQL 安装完成后,会在磁盘上生成一个目录,该目录就被称为 MySQL 的安装目录。
MySQL 5.7 版本的安装配置后,目录结构可能如下图所示:
3.3.1、MySQL目录介绍
1、bin目录
用于放置一些可执行脚本文件,也就是mysql的程序文件
2、data目录
data目录是mysql数据库的数据目录。可以在mysql shell下面通过全局变量查询mysql的数据目录
mysql>show variables like'%datadir%';通过上图可知mysql数据库初始化位置是/.dataDB/mysql/data/
该目录的绝对路径信息必须与my.cn文件里面定义的目录位置保持一致。data目录存放了mysql数据库系统初始化安装时候的一些相关文件:系统数据库、sock文件、表空间数据文件等
3、docs目录
mysql的文档存放目录,用于存放一些文档4、include目录
用于放置一些头文件,如:mysql.h、mysql_ername.h 等5、lib目录
用于存放mysql的一系列库文文件6、man目录
用于存放mysqld命令帮助及相关的说明文档
7、share目录
用于存放mysql的字符集、语言文件目录8、support-files目录
用户存放mysql数据库系统的服务器启动脚本。在需要将mysql注册为系统服务的时候,需要将该目录下面的启动脚本复制到”/etc/init.d/”下面。
3.3.2、MySQL数据(data)目录文件详解
在 MySQL 中,物理文件存放在数据目录中。数据目录与安装目录不同,安装目录用来存储控制服务器和客户端程序的命令,数据目录用来存储 MySQL 服务器在运行过程中产生的数据。本节主要介绍 MySQL 数据目录的物理结构和作用。
MySQL 中任何一项逻辑性或者物理性文件都具有可配置性,另外由于开源的原因,每个版本都有一些改进,所以我们在学习本节内容时要灵活掌握,不能生搬硬套。
如果你不知道 MySQL 的数据目录路径,可以通过SHOW VARIABLES LIKE ‘datadir’;命令查看。
mysql>show variables like'%datadir%';Data 目录用来存放数据库相关的数据信息,包括数据库信息,表信息等。
MySQL 5.7 及之后的版本开始支持集群模式,installer_config.xml 配置文件主要用于配置单节点或集群模式。
my.ini 文件是 MySQL 服务端和客户端主要的配置文件,包括编码集、默认引擎、最大连接数等设置。MySQL 服务器启动时会默认加载此文件。
1、 MySQL data目录里面的文件通过上图可以看出,data目录里面存放了系统数据库、用户自定义数据库,位置相同。而每个独立的数据库目录里面存放了相应的数据库对象文件。
如上图中红色 的椭圆形标记的为系统自动生成的一些系统数据库,红色方框标记的为用户自建的数据库。
data目录文件说明:
系统自建数据库目录
mysql、performance_schema、information_schema、sys都是系统自建的数据库目录,是在数据库初始化完成创建的。每一个数据库对应一个系统存在的目录。通过上图可以看出mysql系统自建的数据库有4个。但是information_schema数据库比较特殊,它没有对应的目录,所以我们在data目录下面只能看见3个对应的系统数据库目录,如下图所示:
用户自建数据库目录
用户自建数据库目录是DBA为用户创建数据库以后,在mysql的数据目录里面会自动生成一个对应的数据目录。例如DBA给用户创建了数据库CMCC,那么在data录下就会生成一个对应的CMCC目录。
mysql>create database CMCC;mysql>show databases;
服务器选项文件:auto.cnf
auto.cnf文件是MySQL 服务器的选项文件,用于存储 server-uuid 的值。server-uuid 与 server-id 一样,用于标识 MySQL 实例在集群中的唯一性。
redo日志文件:ib_logfile0、ib_logfile1
ib_logfile0、ib_logfile1 是支持事务性引擎的 redo 日志文件
表空间数据文件:ibdata1
ibdata1 为共享表空间(系统表空间),如下图所示:
如果采用 InnoDB 引擎,根据mysql的不同安装版本,该文件有一个默认大小,上图中显示ibdata1的大小为12M。该文件的最小值的设置取决于当前mysql页的设定大小,mysql页大小的设定确定了表空间数据文件最小值的设定要求。
我们通过以下方式查看当前mysql页大小的设定值:
mysql>show variables like'%innodb_page_size%';从上图可以看出当前mysql页大小的设定为16k。页大小设定为16K,那么表空间数据库文件的最小值为3M
临时对象文件:ibtmp1
ibtmp1为临时对象文件,为存储临时对象的空间,比如临时表对象等
其他文件
mysql服务器的进程PID文件、mysql服务器的日志文件、mysql的sock文件、mysql的DES秘钥文件等
2、 用户自建数据目录里面的文件
当DBA为用户创建了数据库以后,会在data目录下面生成一个同名的目录。该目录存储了该数据库相关的一些文件。
db.opt
用来保存数据库的配置信息,比如该库的默认字符集编码和字符集排序规则。如果你创建数据库时指定了字符集和排序规则,后续创建的表没有指定字符集和排序规则,那么该表将采用 db.opt 文件中指定的属性。
.frm
在 MySQL 中建立任何一张数据表,其对应的数据库目录下都会有该表的同名的 .frm 文件。.frm文件用来保存每个数据表的元数据(meta)和表结构等信息。数据库崩溃时,可以用 .frm 文件恢复表结构。
.frm 文件跟存储引擎无关,任何存储引擎的数据表都有 .frm 文件,命名方式为表名.frm,如 users.frm。
例如在数据“CMCC”下面创建一个名为“salary_1”的表,那么该目录下面便会产生一个salary_1.frm文件。
✍注意事项:
MySQL 8.0 版本开始,frm 文件被取消,MySQL 把文件中的数据都写到了系统表空间。通过利用 InnoDB 存储引擎来实现表 DDL 语句操作的原子性(在之前版本中是无法实现表 DDL 语句操作的原子性的,如 TRUNCATE 无法回滚)。
.ibd
对于innodb存储引擎的数据表,一个表对应连个两个文件,一个是.frm,用于存储表结构信息;一个是.ibd文件用于存储表中的数据。.ibd与.ibdata文件都专属Inodb存储引擎的表空间数据库文件。
当表空间模式为“独立表空间”时,那么每一个用户的数据库目录里面就会产生一个独立表空间数据文件“*.ibd“文件;
当表空间模式为“共享表空间”时,那么都有用户的数据都使用一个共同的表空间数据文件“ibddata”文件
当然,就算开启了独享表空间,ibdata 文件也会越来越大,因为这个文件里还存储了相依信息:
变更缓冲区
双写缓冲区
撤销日志
✍注意事项:
关于mysql数据库系统的表空间模式,可用以下全局变量来查询当前数据库系统的表空间模式(独立表空间/共享表空间),以及表空间数据文件的大小、名称、自动扩展等信息。
innodb_file_per_table :表空间模式全局变量,当Value部分的值为on即是独立表空间模式,OFF即是共享表空间模式;
innodb_data_file_path :表空间数据文件初始参数变量,Value部分显示了数据文件的名称、大小、是否自动扩展、最大扩展的极限;
innodb_data_home_dir :表空间数据文件的目录,Value的值为空,则与初始化的时候的位置一支,可自定义目录位置;
.MYD和.MYI
.MYD 理解为My Data,用于存放MyISAM表的数据
.MYI 理解为My Index,主要存放MyISAM表的索引即相关信息
3.4、MySQL主配置文件
3.4.1、主配文件来源
Linux 操作系统中 MySQL 的配置文件是 my.cnf,一般会放在 /etc/my.cnf 或 /etc/mysql/my.cnf 目录下。
✍注意事项
如果你使用 rpm 包安装 MySQL,找不到 my.cnf 文件,或者是my.cnf主配置文件搞丢失的时候。可以用以下方法解决:
rpm包安装mysql后,在“/usr/share/mysql/”目录下面会生成mysql主配置文件的模板文件,我们可以复制模板文件到/etc下面以此方式来恢复丢失的my.cnf主配置文件
3.4.1、主配文件变量值的设定
关于mysql所有参数的设定都可以使用my.fn主配置文件来设定,或者是通过变量参数来设置。二者的区别在于使用主配置文件myc.nf来设定的时候,需要重启mysqld服务,且设定的参数值永久生效;使用变量参数来设定的时候,不需要重启mysqd的服务,且是临时生效。
上述参数说明如下:
user:mysqld 程序在启动后将在给定 UNIX/Linux 账户下执行。mysqld 必须从 root 账户启动才能在启动后切换到另一个账户下执行。mysqld_safe 脚本将默认使用 user=mysql 选项来启动 mysqld 程序。
basedir:指定 MySQL 安装的绝对路径;
datadir:指定 MySQL 数据存放的绝对路径;
port:服务端口号,默认为 3306
server-id:MySQL 服务的唯一编号,每个 MySQL 服务的 id 需唯一。
socket:socket 文件所在目录
character-set-server:数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用 4 个字节)
collation-server:数据库字符集对应一些排序等规则,注意要和 character-set-server 对应
init_connect:设置 client 连接 mysql 时的字符集,防止乱码
lower_case_table_names:是否对 sql 语句大小写敏感,1 表示不敏感
key_buffer_size:用于指定索引缓冲区的大小
max_allowed_packet:设置一次消息传输的最大值
no-auto-rehash:仅仅允许使用键值的 UPDATES 和 DELETES
sql_mode:表示 SQL 模式的参数,通过这个参数可以设置检验 SQL 语句的严格程度