Mysql数据目录结构以及文件类型解析

目录

[1. 数据目录](#1. 数据目录)

[2. Data目录](#2. Data目录)

[3. 数据库目录](#3. 数据库目录)

1)db.opt

2).frm

3).MYD和.MYI

4).ibd

5).ibd和.ibdata


在 MySQL 中,物理文件存放在数据目录中。数据目录与安装目录不同,安装目录用来存储控制服务器和客户端程序的命令,数据目录用来存储 MySQL 服务器在运行过程中产生的数据。本节主要介绍 MySQL 数据目录的物理结构和作用。

MySQL 中任何一项逻辑性或者物理性文件都具有可配置性,另外由于开源的原因,每个版本都有一些改进,所以我们在学习本节内容时要灵活掌握,不能生搬硬套。

如果你不知道 MySQL 的数据目录路径,可以通过SHOW VARIABLES LIKE 'datadir';命令查看。

下面分别讲解 MySQL 数据目录里存放的目录和文件。

1. 数据目录

下图是 MySQL(5.7.29)在 Windows 系统下安装的数据文件目录,可以看到有如下几类文件。

Data 目录用来存放数据库相关的数据信息,包括数据库信息,表信息等。

MySQL 5.7 及之后的版本开始支持集群模式,installer_config.xml 配置文件主要用于配置单节点或集群模式。

my.ini 文件是 MySQL 服务端和客户端主要的配置文件,包括编码集、默认引擎、最大连接数等设置。MySQL 服务器启动时会默认加载此文件。

2. Data目录

Data 目录中存放的文件如下图所示:

由图中可以看出,系统数据库和用户自定义数据库的存放路径相同。数据库目录中主要存放相应的数据库对象(图中箭头指向的为 test 数据库目录中存放的文件 )。

对 Data 目录中的文件说明如下:

  • mysql、performance_schema、sakila、sys 和 world 是系统数据库,information_schema 数据库比较特殊,这里没有相应的数据库目录。
  • test 是用户自定义的数据库,也就是用户自己创建的数据库。
  • auto.cnf:MySQL 服务器的选项文件,用于存储 server-uuid 的值。server-uuid 与 server-id 一样,用于标识 MySQL 实例在集群中的唯一性。
  • ib_logfile0、ib_logfile1 是支持事务性引擎的 redo 日志文件
  • ibdata1 为共享表空间(系统表空间)。如果采用 InnoDB 引擎,默认大小为 10M 。
  • ibtmp1 为存储临时对象的空间,比如临时表对象等。

数据目录里可能还有:

  • MySQL 服务器的进程 ID(PID)文件。
  • MySQL 服务器所生成的状态和日志文件。
  • DES 密钥文件或服务器的 SSL 证书。

3. 数据库目录

数据库实际是一个目录,每个目录都保存着相应数据库中的表以及表数据。下面我们以 test 数据库为例讲解目录中存放的文件。

test 数据库中有如下几张数据表:

复制代码
+-------------------+
| Tables_in_test    |
+-------------------+
| tb_student        |
| tb_student_course |
| tb_students_info  |
| tb_usertest       |
+-------------------+

对 test 数据库目录中的文件说明如下:

1)db.opt

用来保存数据库的配置信息,比如该库的默认字符集编码和字符集排序规则。如果你创建数据库时指定了字符集和排序规则,后续创建的表没有指定字符集和排序规则,那么该表将采用 db.opt 文件中指定的属性。

对于 InnoDB 表,如果是独立的表空间,数据库中的表结构以及数据都存储在数据库的路径下(而不是在共享表空间 ibdata1 文件中)。但是数据中的其他对象,包括数据被修改之后,事务提交之间的版本信息,仍然存储在共享表空间的 ibdata1 文件中。

2).frm

在 MySQL 中建立任何一张数据表,其对应的数据库目录下都会有该表的 .frm 文件。.frm文件用来保存每个数据表的元数据(meta)和表结构等信息。数据库崩溃时,可以用 .frm 文件恢复表结构。

.frm 文件跟存储引擎无关,任何存储引擎的数据表都有 .frm 文件,命名方式为表名.frm,如 users.frm。

MySQL 8.0 版本开始,frm 文件被取消,MySQL 把文件中的数据都写到了系统表空间。通过利用 InnoDB 存储引擎来实现表 DDL 语句操作的原子性(在之前版本中是无法实现表 DDL 语句操作的原子性的,如 TRUNCATE 无法回滚)。

3).MYD和.MYI
  • .MYD 理解为 My Data,用于存放 MyISAM 表的数据。
  • .MYI 理解为 My Index,主要存放 MyISAM 表的索引及相关信息。
4).ibd

对于 InnoDB 存储引擎的数据表,一个表对应两个文件,一个是 *.frm,存储表结构信息;一个是*.ibd,存储表中数据。

5).ibd和.ibdata

.ibd 和 .ibdata 都是专属于 InnoDB 存储引擎的数据库文件。当采用共享表空间时,所有 InnoDB 表的数据均存放在 .ibdata 中。所以当表越来越多时,这个文件会变得很大。相对应的 .ibd 就是采用独享表空间时 InnoDB 表的数据文件。

当然,就算开启了独享表空间,ibdata 文件也会越来越大,因为这个文件里还存储了:

  • 变更缓冲区
  • 双写缓冲区
  • 撤销日志
相关推荐
时差9535 分钟前
【面试题】Hive 查询:如何查找用户连续三天登录的记录
大数据·数据库·hive·sql·面试·database
让学习成为一种生活方式7 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
秋意钟33 分钟前
MySQL日期类型选择建议
数据库·mysql
Dxy12393102161 小时前
python下载pdf
数据库·python·pdf
ac-er88882 小时前
MySQL如何实现PHP输入安全
mysql·安全·php
桀桀桀桀桀桀2 小时前
数据库中的用户管理和权限管理
数据库·mysql
superman超哥3 小时前
04 深入 Oracle 并发世界:MVCC、锁、闩锁、事务隔离与并发性能优化的探索
数据库·oracle·性能优化·dba
用户8007165452003 小时前
HTAP数据库国产化改造技术可行性方案分析
数据库
engchina4 小时前
Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询
数据库·python·neo4j
engchina4 小时前
使用 Cypher 查询语言在 Neo4j 中查找最短路径
数据库·neo4j