导读:
根据前面的所学知识,我们知道了InnoDB存储引擎存储数据的数据结构、存储过程,而被组织好的数据则被存储在操作系统的磁盘上,当我们在对表数据进行增删改查时,其实就是InnoDB存储引擎与磁盘的交互。
此外,操作系统中对磁盘的管理归属于文件系统,所以我们也可将数据增删改查的过程称为是InnoDB存储引擎与文件系统的交互。之前我们只是通过工具对数据库中的数据进行操作,并没有真正看到过数据库、表等存储文件,接下来我们就来了解一下在文件系统中,MySQL是以什么样的形式对数据进行的存储?保存了哪些数据?…
一、数据目录
MySQL服务器程序在启动时会在文件系统的某个目录下加载一些文件,之后在运行过程中产生的数据也都会存储到这个目录下的某些文件中,这个目录就称为数据目录。
注:数据目录是用来存储MySQL运行过程中产生的数据,和安装目录不同,一定要区分开。
数据目录对应的系统变量为 datadir,我们可以通过以下语句查询自己本地计算机的数据目录路径:
二、数据目录的结构
MySQL运行过程中的产生的数据库、表、视图、触发器等用户数据都会被存储到数据目录下,此外还有一些其本身所携带的数据。
1、数据库
在创建数据库时,在文件系统中会产生如下变化:
- 在数据目录下,创建一个和数据库名同名的文件夹。
- 在创建的数据库同名文件夹下创建一个名为 db.opt 的文件,这个文件中包含了该数据库的各种属性,比方说该数据库的字符集和比较规则是个啥。
以下是我本地创建的一个 blog 数据库的存储形式:
2、表
文件系统中存储的表数据分为两部分:
- 表结构:用于存储表的基本属性,比如表名、字符集、比较规则等,文件名以".frm"为后缀。
- 表数据:InnoDB以数据页为基本单位组织、存储数据,为了更好的管理这些页,设计InnoDB的大叔们提出了一个表空间或者文件空间(英文名:table space 或者 file space)的概念,这个表空间是一个抽象的概念,它可以对应文件系统上一个或多个真实文件(不同表空间对应的文件数量可能不同)。每一个表空间可以被划分为很多很多很多个页,我们的表数据就存放在某个表空间下的某些页里。设计InnoDB的大叔将表空间划分为几种不同的类型:
- 系统表空间(system tablespace):从 MySQL5.5.7 到 MySQL5.6.6 之间的各个版本中,MySQL表中的数据都会被默认存储到这个系统表空间。
- 独立表空间(file-per-table tablespace):在 MySQL5.6.6 以及之后的版本中,InnoDB并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。
注1:系统表空间可以对应文件系统上一个或多个实际的文件,默认情况下,InnoDB会在数据目录下创建一个名为ibdata1、大小为12M的自扩展文件。
注2:每个表的独立表空间被存储在数据目录下同名数据库文件夹下,文件名与表名一致,以".ibd"为后缀。
3、视图
MySQL中的视图其实是虚拟的表,也就是某个查询语句的一个别名而已,所以在存储视图的时候是不需要存储真实的数据的,只需要把它的结构存储起来就行了。和表一样,描述视图结构的文件也会被存储到所属数据库对应的子目录下边,只会存储一个视图名.frm的文件。
4、其他文件
除了上述用户数据外,数据目录下还包括为了更好运行程序的一些额外文件,主要包括这几种类型的文件:
- 服务器进程文件:我们知道每运行一个MySQL服务器程序,都意味着启动一个进程。MySQL服务器会把自己的进程ID写入到一个文件中。
- 服务器日志文件:在服务器运行过程中,会产生各种各样的日志,比如常规的查询日志、错误日志、二进制日志、redo日志等。
- 默认/自动生成的SSL和RSA证书和密钥文件:主要是为了客户端和服务器安全通信而创建的一些文件。