通过文件来了解MySQL体系结构-bin格式文件

对于很多同学来说,如果能够看得见,有直观感受,对于一个事物的理解就很更加深刻。

所以MySQL对于我们来说,直观的感受就一个服务(内存结构)和一些物理文件。

内存结构我们看不到,但是我们能够看到这些物理文件,所以我们先从这里开始。

如下是一个测试环境中得到的文件列表,我们来简单解读一下。

-rw-r----- 1 mysql mysql 56 Jan 2 2018 auto.cnf

-rw-r----- 1 mysql mysql 860 Aug 26 22:49 dev01-slow.log

drwxr-x--- 2 mysql mysql 20480 Nov 9 23:55 devopsdb

-rw-r----- 1 mysql mysql 1053 Jan 20 15:44 ib_buffer_pool

-rw-r----- 1 mysql mysql 79691776 Jan 20 15:44 ibdata1

-rw-r----- 1 mysql mysql 50331648 Jan 20 15:46 ib_logfile0

-rw-r----- 1 mysql mysql 50331648 Jan 20 15:46 ib_logfile1

-rw-r----- 1 mysql mysql 12582912 Jan 20 15:46 ibtmp1

drwxr-x--- 2 mysql mysql 4096 Sep 5 22:33 kmp

-rw-r--r-- 1 mysql mysql 531 Jan 20 15:42 my.cnf

drwxr-x--- 2 mysql mysql 4096 Sep 5 22:33 mysql

-rw-r----- 1 mysql mysql 435 Jan 20 15:44 mysql-bin.000001

-rw-r----- 1 mysql mysql 169 Jan 20 15:44 mysql-bin.000002

-rw-r----- 1 mysql mysql 150 Jan 20 15:46 mysql-bin.000003

-rw-r----- 1 mysql mysql 57 Jan 20 15:46 mysql-bin.index

-rw-r----- 1 mysql mysql 16432283 Jan 20 15:46 mysqld.log

-rw-r----- 1 mysql mysql 6 Jan 20 15:46 mysqld.pid

drwxr-x--- 2 mysql mysql 4096 Jan 2 2018 performance_schema

drwxr-x--- 2 mysql mysql 12288 Jan 2 2018 sys

drwxr-x--- 2 mysql mysql 4096 Dec 22 17:52 testdb

上面的列表信息量很大,如果我们一个一个解释一遍会很散乱,我们按照文件名和类型捋一下。

文件类型

文件名

说明

文件夹

performance_schema

数据库,MySQL的数据字典

文件夹

mysql

数据库,MySQL的数据字典

文件夹

sys

数据库,MySQL的数据字典

文件夹

testdb

数据库,存放应用数据

文件夹

kmp

数据库,存放应用数据

文件夹

devopsdb

数据库,存放应用数据

文件

my.cnf

参数文件,默认是从/etc/my.cnf中读取,也可以自定义

文件

mysql-bin.000001

二进制日志,即binlog,数据变化都会在二进制日志里面记录

文件

mysql-bin.000002

二进制日志,即binlog,数据变化都会在二进制日志里面记录

文件

mysql-bin.000003

二进制日志,即binlog,数据变化都会在二进制日志里面记录

文件

mysql-bin.index

二进制日志序列文件,里面会记录相应的binlog名称

文件

mysqld.pid

MySQL服务的进程号

文件

mysqld.log

错误日志,记录数据库启动的日志,服务端的一些日志

文件

ibtmp1

innodb临时表的独立表空间

文件

ibdata1

系统表空间

文件

ib_logfile1

InnoDB层特有的日志文件,redo文件

文件

ib_logfile0

InnoDB层特有的日志文件,redo文件

文件

dev01-slow.log

慢日志,应用层面出现了查询性能较差的SQL,都会在慢日志里面记录下来

文件

auto.cnf

MySQL启动时如果没有UUID,就会生成一个在这个文件

文件

ib_buffer_pool

5.7新特性,关闭MySQL时,会把内存中的热数据保存在这个文件,提高使用率和性能

如果我们查看文件夹中的文件,就会对MySQL数据存储有了一个直观的认识,比如数据库testdb中存在表t2,testdata,所在的文件夹下的文件列表如下:

-rw-r----- 1 mysql mysql 61 Jun 26 2018 db.opt

-rw-r----- 1 mysql mysql 8586 Jun 26 2018 t2.frm

-rw-r----- 1 mysql mysql 114688 Jun 26 2018 t2.ibd

-rw-r----- 1 mysql mysql 8632 Sep 3 23:16 testdata.frm

-rw-r----- 1 mysql mysql 98304 Sep 3 23:49 testdataibd

这两个表都是InnoDB存储引擎存储,每个表会有两类文件:.frm和.ibd,其中.frm文件存放的是表结构信息,.ibd文件存放的是表数据。

对于分区表,.ibd文件将会是多个,不过互联网行业中对于分区表使用有限。

MySQL里面的文件蛮有意思,之前大体有两个参数来做基本的控制。一个是innodb_data_file_path就是一个共享表空间,数据都往这一个文件里放,也就是ibdata1,这个文件其实角色是有重复的,undo,数据都会放在一起。ibdata1会持续增长,无法收缩。另外一个参数是innodb_file_per_table,这样一来,就成了独立表空间,通俗一些就是每一个表都有独立的文件.frm和.ibd,而且实际中使用独立表空间还是比较普遍的,在MySQL 8.0之后这种情况又有了变化。

到了这里,我们基本对MySQL文件有了一个直观的认识。 我们简单总结一下,MySQL的文件大体是这样的结构:


通过文件来了解MySQL体系结构


推荐阅读