所以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的文件大體是這樣的結構: