第 8 章 数据的家——MySQL的数据目录
8.1 数据库和文件系统的关系
数据库把表存储在文件系统上。当我们读取数据时,存储引擎会从文件系统中把数据读出来返回给我们;当我们写入数据时,存储引擎会把这些数据写回文件系统。
8.2 MySQL数据目录
8.2.1 数据目录和安装目录的区别
数据目录是用来存储MySQL在运行过程中产生的数据。
8.2.2 如何确定MySQL中的数据目录
SHOW VARIABLES LIKE 'datadir';
8.3 数据目录的结构
8.3.1 数据库在文件系统中的表示
在MySQL中,每个数据库都对应数据目录下的一个子目录,或者说对应一个文件夹。当我们创建一个数据库时,MySQL会:
- 在数据目录下创建一个和数据库同名的子目录
- 在该目录下创建一个名为db.opt的文件,包含了该数据库的各种属性,比如字符集和比较规则
PS:MySQL 8 引入了新的系统表格,取消了原有的db.opt文件。在 MySQL 8 中,数据库的字符集和排序规则不再存储在数据目录中的 db.opt 文件里,而是存储在新的系统表 mysql.schemata
中
SELECT
`SCHEMA_NAME`,
`DEFAULT_CHARACTER_SET_NAME`,
`DEFAULT_COLLATION_NAME`
FROM
`information_schema`.`SCHEMATA`
WHERE
`SCHEMA_NAME` = 'your_database_name';
8.3.2 表在文件系统中的表示
每个表的信息可以分为两种:
- 表结构的定义
- 表中的数据
InnoDB和MyISAM都在数据目录下对应的数据库子目录下创建了一个专门用于描述表结构的文件,文件名为表名.frm。
PS:MySQL8.0中不再单独提供表名.frm,而是合并在表名.ibd文件中。
8.3.2.1 InnoDB是如何存储表数据的
表空间是一个抽象的概念,它可以对应文件系统上一个或多个真实文件(不同表空间对应的文件数量可能不同)。每一个表空间可以被划分为很多个页,表数据就存储在某个表空间下的某些页中。表空间分为以下几类:
-
系统表空间(system tablespace)
系统表空间对应文件系统上一个或多个实际的文件。默认情况下,InnoDB会在数据目录下创建一个名为ibdata1的大小为12M的自扩展文件,就是对应的系统表空间在文件系统上的表示。MySQL5.5.7-5.6.6之间的各个版本,表中的数据都会被默认存储到穿上系统表空间。
-
独立表空间(file-per-table tablespace)
在MySQL5.6.6以及之后的版本中,InnoDB不会默认地把所有表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是有多少表就有多少表空间,文件名:表名.idb
-
其他类型的表空间
通用表空间(general tablespace)、undo表空间(undo tablespace)、临时表空间(temporary tablespace)等。
8.3.2.2 MyISAM是如何存储表数据的
MyISAM的表数据都存放到对应的数据库子目录下,比如表test使用MyISAM存储引擎,则有:
- test.frm,表结构
- test.MYD,表数据
- test.MYI,索引
8.3.3 视图在文件系统中的表示
视图不需要存储真实的数据,只需要把它的结构存储起来,在数据库对应的子目录下,视图名.frm
8.3.4 其他的文件
- 服务器进程文件,MySQL服务器会把自己的进程ID写入到一个文件中。
- 服务器日志文件,比如查询日志、错误日志、二进制日志、redo日志等
- 默认/自动生成 的SSl和RSA证书和密钥文件
8.4 文件系统对数据库的影响
- 数据库名称和表名称长度受限于文件系统文件名称的最大长度
- 特殊字符
- 文件长度受限于文件系统的最大长度
8.5 MySQL系统数据库简介
SHOW DATABASES;
- mysql:存储了MySQL的用户账户和权限信息,一些存储过程、事件的定义信息,一些运行过程中产生的日志信息,一些帮助信息以及时区信息等。
- information_schema:保存着MySQL服务器维护的所有其他数据库的信息,比如有哪些表、哪些视图、哪些触发器、哪些列、哪些索引等等,这些并不是真实的用户数据,而是一些描述性信息,也被称为元数据。
- performance_schema:保存MySQL服务器运行过程中的一些状态信息,包括最近执行了哪些语句、执行耗时、内存使用情况等。
- sys:通过视图的形式把information_schema和performance_schema结合起来,方便程序员。
8.6 总结
- InnoDB、MyISAM会把数据存储在文件系统上
- 系统变量
datadir
表明了数据目录的路径 - 每个数据库对应数据目录下的一个子目录
- 对于InnoDB,表结构存储在表名.frm,表数据存储在表名.ibd(MySQL8后只有ibd)
- 对于MySQL,表结构存储在表名.frm,表数据存储在表名.MYD,索引存储在表名.MYI