Mysql的资料目录

我们知道,像InnoDB、MyISAM这样的储存引擎都是把资料存在磁碟里,而作业系统是使用档案系统管理磁碟的,所以我们也可以说像InnoDB、MyISAM这样的储存引擎都是把资料存在档案系统上。
当我们要读取时,储存引擎从档案系统中读取资料出来给我们,写入的时候,储存引擎一样将资料写回档案系统中。
今天就是要说明InnoDB、MyISAM这两个储存引擎的资料如何在档案系统中储存。

资料目录结构

先来看看Mysql的资料目录在那里

mysql> show variables like 'datadir';
+---------------+-----------------------+
| Variable_name | Value                 |
+---------------+-----------------------+
| datadir       | /usr/local/var/mysql/ |
+---------------+-----------------------+
1 row in set (0.23 sec)

以下为我本机的Mysql资料库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| my_database        |
| mydatabase         |
| mysql              |
| performance_schema |
| ryan_demo_db       |
| sys                |
+--------------------+
7 rows in set (0.07 sec)

再来Mysql运行过程中会产生许多资料,像是我们建立的资料库以及一些让程序顺利运行额外的资料等。
我们一个个来看

资料库

当建立资料库的时候Mysql会做两件事:

  1. 在资料库目录下建立一个与资料库名称相同的子目录(也就是资料夹)
  2. 在与资料库名称相同的子目录下建立一个名叫db.opt的档案(包含了db的一些属性像是字元集和比较规则),但在mysql8.0版本後已移除,请参考官方说明

看看我的Mysql资料目录

(base) ➜  bin cd /usr/local/var/mysql
(base) ➜  mysql ls -alt
total 12608648
-rwxrwxrwx    1 ryanlai  admin    50331648  9 10 18:27 ib_logfile0
-rwxrwxrwx    1 ryanlai  admin    27262976  9 10 18:27 undo_002
-rwxrwxrwx    1 ryanlai  admin    27262976  9 10 18:27 undo_001
-rw-r-----    1 ryanlai  admin      196608  9 10 18:27 #ib_16384_0.dblwr
-rwxrwxrwx    1 ryanlai  admin    12582912  9 10 18:27 ibdata1
-rwxrwxrwx    1 ryanlai  admin    50331648  9 10 18:27 ib_logfile1
-rw-r-----    1 ryanlai  admin   844245421  9 10 18:27 binlog.000020
-rwxrwxrwx    1 ryanlai  admin    41943040  9 10 18:15 mysql.ibd
drwxrwxrwx   51 ryanlai  admin        1632  9 10 18:00 .
-rw-r-----    1 ryanlai  admin         256  9 10 18:00 binlog.index
-rw-r-----    1 ryanlai  admin  1073742006  9 10 18:00 binlog.000019
-rw-r-----    1 ryanlai  admin  1073742006  9 10 17:07 binlog.000018
-rw-r-----    1 ryanlai  admin  1073742163  9 10 16:12 binlog.000017
-rw-r-----    1 ryanlai  admin  1073741930  9 10 15:05 binlog.000016
-rw-r-----    1 ryanlai  admin  1073742113  9 10 14:26 binlog.000015
-rw-r-----    1 ryanlai  admin     8585216  9 10 14:12 #ib_16384_1.dblwr
drwxr-x---    6 ryanlai  admin         192  9 10 13:42 ryan_demo_db
-rw-r-----    1 ryanlai  admin    12582912  9 10 10:10 ibtmp1
-rw-r-----    1 ryanlai  admin        4441  9 10 10:09 MacBook-Pro-76.local.err
-rw-r-----    1 ryanlai  admin           6  9 10 10:09 MacBook-Pro-76.local.pid
-rw-r-----    1 ryanlai  admin         156  9 10 10:09 binlog.000014
drwxr-x---   12 ryanlai  admin         384  9 10 10:09 #innodb_temp
-rw-r-----    1 ryanlai  admin        3664  9  9 12:43 binlog.000013
drwxr-x---    2 ryanlai  admin          64  9  5 15:36 mydatabase
drwxr-x---    5 ryanlai  admin         160  9  3 16:33 my_database
-rw-r-----    1 ryanlai  admin           6  9  3 14:08 MacBook-Pro-76.pid
-rw-r-----    1 ryanlai  admin         156  9  3 14:08 binlog.000012
-rw-r-----    1 ryanlai  admin         156  9  3 13:41 binlog.000011
-rw-r-----    1 ryanlai  admin         156  9  3 11:16 binlog.000010
-rw-r-----    1 ryanlai  admin         156  9  3 11:08 binlog.000009
-rw-r-----    1 ryanlai  admin         156  9  3 10:58 binlog.000008
-rw-r-----    1 ryanlai  admin         200  9  3 10:54 binlog.000007
-rw-r-----    1 ryanlai  admin        8709  9  3 10:39 ib_buffer_pool
-rw-r-----    1 ryanlai  admin         179  9  3 10:39 binlog.000006
-rw-r-----    1 ryanlai  admin           6  9  2 12:49 mysql_upgrade_info
drwxrwxrwx    8 ryanlai  admin         256  9  2 12:49 mysql
-rw-r-----    1 ryanlai  admin        5905  9  2 12:48 MacBook-Pro-76.err
-rw-r-----    1 ryanlai  admin         346  9  2 12:48 binlog.000005
drwxrwxrwx  112 ryanlai  admin        3584  7 10 12:57 performance_schema
drwxrwxr-x   11 ryanlai  admin         352  6 16 11:53 ..
drwxrwxrwx    3 ryanlai  admin          96  3 31  2019 sys
-rw-r-----    1 _mysql   admin         592  7 17  2018 Ryande-Air.err
-rw-r-----    1 ryanlai  admin          56  7 17  2018 auto.cnf
-rwxrwxrwx    1 ryanlai  admin         452  7 17  2018 public_key.pem
-rwxrwxrwx    1 ryanlai  admin        1680  7 17  2018 private_key.pem
-rwxrwxrwx    1 ryanlai  admin        1112  7 17  2018 client-cert.pem
-rwxrwxrwx    1 ryanlai  admin        1676  7 17  2018 client-key.pem
-rwxrwxrwx    1 ryanlai  admin        1112  7 17  2018 server-cert.pem
-rwxrwxrwx    1 ryanlai  admin        1676  7 17  2018 server-key.pem
-rwxrwxrwx    1 ryanlai  admin        1112  7 17  2018 ca.pem
-rwxrwxrwx    1 ryanlai  admin        1680  7 17  2018 ca-key.pem    

可以看到除了information_schema这个系统资料库外(MySQL的工程师特殊处理),其他资料库在资料目录下都有对应的子目录。

再看到ryan_demo_db资料库里面

(base) ➜  mysql cd ryan_demo_db 
(base) ➜  ryan_demo_db ls -alt
total 1794592
-rw-r-----   1 ryanlai  admin  901775360  9 10 18:27 per2.ibd
drwxrwxrwx  51 ryanlai  admin       1632  9 10 18:00 ..
-rw-r-----   1 ryanlai  admin   11534336  9 10 13:56 single_table.ibd
drwxr-x---   6 ryanlai  admin        192  9 10 13:42 .
-rw-r-----   1 ryanlai  admin     114688  9  7 16:29 ryan_demo2_table.ibd
-rw-r-----   1 ryanlai  admin     114688  9  7 15:40 ryan_demo_table.ibd

却没有看到子目录里面并没有db.opt的档案(因为我是Mysql8.0版本)。

我们的资料其实都是以纪录的形式插入到表中。
表的资讯有两个部分:

  1. 表结构定义。表的名称是什麽、表有多少列、每列的资料类型是什麽、有什麽限制条件跟索引、用什麽字元集和比较规则等资讯。

  2. 表中的资料

这些描述表结构的资讯会在对应的资料库子目录下(ex:/usr/local/var/mysql/ryan_demo_db)创建.frm档来保存(但一样在Mysql8.0移除了)。

而表中的资料在不同的储存引擎会有不同的方式。
Innodb
设计Innodb的工程师提出了表格空间(档案空间)的概念。这是一个抽象概念,它可以对应档案系统上一个或多个真实档案(不同表格空间对应的档案数量可能不同)。每个表格空间被划分为很多页,表资料就存放在表格空间下的页里面。
表格空间有几种类型

  1. 系统表格空间:可以在资料目录里面看到一个名为ibdata1,大小为12MB的档案(不够用会自行扩充),这个档案就是对应的系统表格空间在档案系统里的表示
(base) ➜  mysql ls -alt
total 12608648
-rwxrwxrwx    1 ryanlai  admin    50331648  9 10 18:27 ib_logfile0
-rwxrwxrwx    1 ryanlai  admin    27262976  9 10 18:27 undo_002
-rwxrwxrwx    1 ryanlai  admin    27262976  9 10 18:27 undo_001
-rw-r-----    1 ryanlai  admin      196608  9 10 18:27 #ib_16384_0.dblwr
-rwxrwxrwx    1 ryanlai  admin    12582912  9 10 18:27 ibdata1
  1. 独立表格空间:
(base) ➜  ryan_demo_db ls -alt
total 1794592
-rw-r-----   1 ryanlai  admin  901775360  9 10 18:27 per2.ibd
drwxrwxrwx  51 ryanlai  admin       1632  9 10 18:00 ..
-rw-r-----   1 ryanlai  admin   11534336  9 10 13:56 single_table.ibd
drwxr-x---   6 ryanlai  admin        192  9 10 13:42 .
-rw-r-----   1 ryanlai  admin     114688  9  7 16:29 ryan_demo2_table.ibd
-rw-r-----   1 ryanlai  admin     114688  9  7 15:40 ryan_demo_table.ibd

这里每一个.ibd档案就是对应的独立表格空间在档案系统里的表示(一个table一个.ibd档)
补充说明,可以由启动选项innodb_file_per_table决定是否要将表资料储存在系统表格空间(innodb_file_per_table=0)还是独立表格空间(innodb_file_per_table=1)。

  1. 其他类型的表格空间:
    像是通用表格空间、undo表格空间、临时表格空间等,不赘述,有用到再提。

MyISAM
主要差异是,Innodb资料和索引是同一回事,但MyISAM是分开的,在档案系统会是用不同的档案来存放资料和索引。MyISAM也没有表格空间一说,资料和索引就存放在对应的资料库目录下。
我的MyISAM资料库(Mysql8.0)如下

(base) ➜  mysql cd my_database 
(base) ➜  my_database ls -alt
total 16
drwxrwxrwx  51 ryanlai  admin  1632  9 13 13:22 ..
-rw-r-----   1 ryanlai  admin  1024  9  3 16:33 new_table.MYI
drwxr-x---   5 ryanlai  admin   160  9  3 16:33 .
-rw-r-----   1 ryanlai  admin     0  9  3 16:33 new_table.MYD
-rw-r-----   1 ryanlai  admin  2786  9  3 16:33 new_table_892.sdi

.MYD就是表的资料档案(使用者纪录),.MYI表示表的索引档案,.sdi就是表的结构(Mysql8.0版本以前是.frm档)。

让程序顺利运行额外的资料

  1. 服务器处理程序档案:每运行一个mysql服务器程序,都表示启动一个处理程序,Mysql会把自己的处理程序ID写入到这个档案中
  2. 服务器纪录档:像是查询纪录、错误纪录、二进位纪录、redo纪录等(之後会一一说明,先大概知道就好)。
  3. SSL和RSA证书与金钥档案:主要是为了client与server通讯而创建的档案,一样有个概念就好。

档案系统对资料库的影响

因为Mysql资料都是存在档案系统的,因此就不得不受到档案系统的一些限制。

  1. 资料库和表名称不得超过档案系统所允许的最大长度
  2. 特殊字元的问题。为了避免特殊字元档案系统不支援的情况,Mysql会把资料库和表名称中所有除了数字和拉丁字母以外的任何字元都映射成@+编码值的形式,并将其作为档案名称。举个例子:假设表名称为'test?',由於?不属於数字或拉丁字母,会被映射成@+编码值,所以表对应的.sdi(or .frm)的名称就变成了[email protected](or [email protected])
  3. 档案长度受限於档案系统最大长度

Mysql系统资料库介绍

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| my_database        |
| mydatabase         |
| mysql              |
| performance_schema |
| ryan_demo_db       |
| sys                |
+--------------------+
7 rows in set (0.07 sec)
  • mysql。很重要,储存了使用者帐户及权限资讯、一些预存程序和事件的定义资讯、运行过程中产生的纪录档、一些说明资讯及时区资讯等
  • information_schema。保存着服务器维护的所有其他资料库资讯,比如有那些表、那些视图、那些触发器、那些列、那些索引等
  • performance_schema。运行过程中的状态资讯(最近执行了那些叙述、执行过程中每阶段花费多久时间、记忆体的使用情况)
  • sys。透过视图的方式把information_schema及performance_schema结合起来,让开发人员更好理解性能资讯。

<<:  [Tableau Public] day 13:进阶版的表格呈现方式

>>:  DAY01 - 初次参加铁人赛的中年大叔の简介

[Day21] Vue 3 单元测试 (Unit Testing) - Props & Computed

Props 与 Computed 是开发元件最常使用的属性,下面的范例是一个运用 Props 与 C...

Day 11. slate × Interfaces × Document-Model

接下来的篇章我们会把目光聚焦於 interfaces/ 这个目录底下的内容,想确认 slate p...

未来狂想:量子计算

人的科技文明发展始终来自於人性 随着科技的一路发展,人类的文明与科技水准一路向上的平稳,再发展的过程...

DAY30:赛後心得检讨

完赛检讨 资料处理 虽然我们有大致上把红框等杂讯去除掉,但我们还是没有完全把照杂讯清除乾净。 Yol...

DAY 21 制作 Nav Bar - FontAwesome

FontAwesome FontAwesome 让我们可以快速方便的使用 Icon 的设计,不过他有...