【MYSQL从青铜到王者】 第一篇:Mysql文件组成

主角是数据库的物理文件

说在前面

有所不知,在MySQL里,物理文件是放在数据目录。数据目录与安装目录是不同的,安装目录用来存储控制服务器和客户端程序的命令,而数据目录用来存储MySQL服务器在运行时产生的数据。主要介绍MySQL数据目录的物理结构有哪些:

首先说,数据库里任何一项逻辑性或者物理性文件都可以自己来配,其次因为开源,每个版本都有一些改进,所以在学习本篇内容时要灵活才行;如果你不知道 MySQL 的数据目录路径,可以通过SHOW VARIABLES LIKE 'datadir';这个命令来查看:

InnoDB

如何查看你的mysql现在已提供什么存储引擎:

show ENGINES;

所示: 简单的说,文件架构是物理文件组成&数据文件组成

如何查看当前mysql当前默认的存储引擎:
mysql> show create table 表名;
你要看某个表用了什么引擎(在显示结果里面参数engine后面的就表示该表当前用的存储引擎):

这个create table 库名.表名 engine = innodb;
这样就可以将表的引擎变更为innodb引擎,重启mysql服务器:mysqladmin -u root -p shutdown或者service mysqld restart登录mysql数据库就可以了。

数据目录

自己用的是MySQL5.7.29在Win10系统下安装的数据文件目录,看到有如下几类文件:

顾名思义,其中Data目录是用来放库相关的数据信息,包括数据库的信息,表信息等。值得注意的是,MySQL 5.7及后面的版本开始支持集群模式,那就用installer_config.xml配置文件来配置单节点还是集群模式;

my.ini 文件是 MySQL 服务端和客户端主要的配置文件,这个比较熟悉,其中包括一些编码集、哪些引擎、最大连接数等设置。默认情况下MySQL服务器启动时会首先加载这个文件;

Data目录

Data 目录中存放的文件所示:

图中可看出,系统数据库和我们的用户自定义数据库的存放路径是相同的。数据库目录中主要存放相应的数据库对象,比如:图中箭头指向的是test数据库目录里存放的文件:

文件说明:

  • mysql、performance_schema、sakila、sys 和 world这都是系统数据库,但是这个information_schema数据库就特殊,它没有相应的数据库目录
  • test是我们自己创建的数据库。
  • auto.cnf:MySQL 服务器的选项文件,是用于存server-uuid的值。server-uuid 与 server-id一样,用于标识MySQL实例在集群中的是否唯一。
  • ib_logfile0、ib_logfile1是支持事务性引擎的redo日志文件
  • ibdata1是共享表空间,也就是系统表空间。如果是采用InnoDB,默认大小为10M 。
  • ibtmp1是存储临时对象的空间,例如临时表对象等。

数据目录里可能还有:MySQL服务器的进程ID文件,MySQL服务器所生成的状态和日志文件,DES 密钥文件或服务器的 SSL 证书等。

数据库目录

文件说明如下:
1)db.opt
保存数据库的配置信息,比如该库默认的字符集编码和字符集排序规则。如果你创建数据库时指定了字符集和排序规则,后续创建的表没有指定字符集和排序规则,那么该表将采用db.opt文件中默认的属性

对InnoDB表来说,如果是独立的表空间,数据库中的表结构以及数据都是放在数据库的路径下面(而不是在共享表空间ibdata1 文件中)。但是对于数据中的其他对象,包括数据被修改了之后,事务提交之间的版本信息,仍然是放在共享表空间的ibdata1文件里。

2).frm
在 MySQL中建立的任何一张数据表,其对应的数据库目录下都会有该表的.frm文件。.frm文件则是用来保存每个数据表的元数据(meta)和表结构等信息。当数据库崩溃时,我们就用.frm 文件来**恢复表结构。

3).frm
任何存储引擎的数据表都有.frm 文件,命名方式:*表名.frm*,如 users.frm。从MySQL 8.0版本开始,frm文件被取消,MySQL 把文件中的数据都写到了系统表空间。然后再通过利用InnoDB存储引擎来实现表DDL 语句操作的原子性在之前版本中是无法体现表DDL语句操作的原子性,譬如TRUNCATE无法进行回滚。

4).MYD和.MYI
.MYD理解是My Data,存放 MyISAM 表的数据。
.MYI理解是My Index,主要存放 MyISAM 表的索引和相关信息。 5).ibd
对于InnoDB存储引擎的数据表,一个表是对应两个文件的,一个是.frm,存储表结构信息;另一个是.ibd,存储表中数据。 6).ibd和.ibdata .ibd和.ibdata都属于InnoDB存储引擎的数据库文件。当采用共享表空间,所有InnoDB表的数据均存放在.ibdata中。所以当表越来越多,这个文件会变得很大。相对应的.ibd是采用独享表空间InnoDB 表的数据文件。

当然,就算开启了独享表空间,那这个ibdata 文件也会越来越大,因为这个文件里还存储了: 变更缓冲区, 双写缓冲区, 撤销日志.

“.ibd”文件和ibdata文件

这两种文件都是存放Innodb数据的文件,之所以有两种文件来存放Innodb的数据,包括一些包括索引,是因为Innodb的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是独享表空间存放存储数据。独享表空间存储方式使用“.ibd”文件来存放数据,且每个表的“.ibd”文件,文件存放在和MyISAM数据相同的位置上的。如果选用共享存储表空间来存放数据,则会使用ibdata文件来存放,所有表共同使用一个或者多个,都可以自己来配这ibdata文件。

ibdata文件可以通过innodb_data_home_dir和innodb_data_file_path两个参数共同配置组成,innodb_data_home_dir配置数据存放的总目录,而innodb_data_file_path配置每一个文件的名称。

innodb_data_file_path中可以一次配置多个ibdata文件。文件可以是指定大小,也可以是自动扩展的,但是Innodb限制了仅仅只有最后一个ibdata文件能够配置成自动扩展类型。当我们需要添加新的ibdata文件的时候,只能添加在我们innodb_data_file_path配置的最后,必须要启MySQL才能完成ibdata的添加工作。不过如果我们使用独享表空间存储方式的话,就不会有这样的问题。

总结:

共享表空间以及独占表空间都是针对数据的存储方式来说的。

  • 共享表空间: 某一个数据库的所有的表数据,索引文件全部放在一个文件中。

  • 独占表空间: 每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件。其中这个文件包括了单独一个表的数据内容和索引内容。

优缺点:

共享表空间

优点:
可以放表空间把它分成多个文件存放到各个磁盘上。数据和文件放在一起来方便管理的。
缺点:
所有的数据和索引存放到一个文件中,多个表及索引在表空间是混合存储,这样对于一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,日志系统这类应用最不适合用共享表空间

独立表空间

优点:
1.每个表都有自已独立的表空间。
2.每个表的数据和索引都会存在自已的表空间。
3.可以实现单表在不同的数据库中移动。
4.空间可以回收的。
a) Drop table操作自动回收表空间,那么对于统计分析或是日值表,删除大量数据后可以通过:alter table TableName engine=innodb;回收不用的空间。
b)对于使用独立表空间的表,不管怎么删除,表空间碎片不会太严重的影响性能,还是有机会处理。
缺点:
所以当单表增加过大,如超过100个G。

结论是相比较之下,使用独占表空间的效率以及性能会更高一点;

Replication相关文件:

  • master.info 文件:

master.info 文件存在于Slave 端的数据目录下,里面存放了该Slave 的Master 端的相关信息,包括Master 的主机地址,连接用户,连接密码,连接端口,当前日志位置,已经读取到的日志位置等信息。

  • relay log 和relay log index

mysql-relay-bin.xxxxxn 文件用于存放Slave 端的I/O 线程从Master端所读取到的Binary Log信息,然后由Slave 端的SQL 线程从该relay log中读取并解析相应的日志信息,转化成Master所执行的SQL语句,然后在Slave 端应用。mysql-relay-bin.index 文件的功能类似于mysql-bin.index ,同样是记录日志的存放位置的绝对路径,只不过他所记录的不是Binary Log,而是Relay Log。

  • relay-log.info 文件:

类似于master.info,它存放通过Slave 的I/O 线程写入到本地的relay log的相关信息。供Slave端的SQL 线程以及某些管理操作随时能够获取当前复制的相关信息。

其他文件

  • system config file 

mysql系统配置文件my.cnf 在linux/Unix下默认存放在/etc目录下。
windows环境一般存放在c:/windows目录下面。my.cnf文件包含多种参数组(group)。 每种参数组都通过中括号给定了固定组名,如[mysqld]组中包含了服务器启动的时候的。 初始化参数,[client]组中包含着客户端工具程序可以读取的参数,此外还有其他针对于各种客户端软件。 的特定参数组,如mysql程序使用[mysql],mysqlchk使用的[mysqlchk]等等。

  • pid file

pid file是mysqld应用程序在Unix/Linux环境下的一个进程文件,和许多其他Unix/Linux服务端程序一样,存放自己的进程号

  • socket file

socket file文件也是在Unix/Linux环境下才有的,用户在Unix/Linux 环境下客户端链接可以不通过tcp/ip 网络可以直接用unix socket来链接Mysql。

                                    --End--

你可能感兴趣的:(【MYSQL从青铜到王者】 第一篇:Mysql文件组成)