对于很多同学来说,如果能够看得见,有直观感受,对于一个事物的理解就很更加深刻。
所以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的文件大体是这样的结构: