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

所以MySQL对于我们来说,直观的感受就一个服务(内存结构)和一些物理文件。内存结构看不到,但是能够看到这些物理文件,所以从这里开始。

如下是一个测试环境中得到的文件列表

```sh
-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的数据字段                                       |
| sys                | 文件夹   | 数据库,MySQL的数据字段                                       |
| mysql              | 文件夹   | 数据库,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文件.默认为2组,可以设置为3组      |
| dev01-slow.log     | 文件     | 慢日志,应用层面出现了查询性能比较差的SQL,都会在慢日志记录下来 |
| auto.cnf           | 文件     | MySQL启动时如有没有UUID,就会生成这个文件                     |
| ib_butter_pool     | 文件     | 5.7新特性,关闭MySQL时,会把内存中的热数据保存在这个文件,提高使用率和性能 |

 

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

```sh
-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的文件大体是这样的结构:

posted @ 2019-06-05 14:14  周亚澄  阅读(602)  评论(0编辑  收藏  举报