Bombax's Knowledge Document Notes Bombax's Knowledge Document Notes
首页
  • 前置

    • 尚硅谷Java学习
    • 基础软件安装与配置
  • 核心

    • Java从入门到精通(JDK17版)
    • MySQL从入门到高级-基础篇
    • MySQL从入门到高级-高级篇
    • JDBC 核心技术(JDK21版)
    • JavaWeb 技术
  • 学习笔记

    • POJO 概念
  • Spring Cloud

    • SpringCloud
    • SpringCloud-Alibaba
  • 持久层框架

    • MyBatis
    • MyBatis-Plus
  • 相关知识

    • Mybatis 代码生成工具比较
  • 安全框架

    • 安全框架之 Spring Security
    • 安全框架之 Shiro
  • 定时任务框架

    • 定时任务框架之 Quartz
    • 定时任务框架之 XXL-JOB
  • Java 日志热门框架
  • Git 常用命令
  • Swagger API 文档生成工具
  • Motan RPC (opens new window)
  • Lombok Tutorial (opens new window)
  • Lombok Features (opens new window)
  • FastJSON2 (opens new window)
  • Spring Framework 5 中文文档 (opens new window)
  • XStream (opens new window)
  • fluent-validator 业务逻辑验证框架 (opens new window)
  • ehcache java 缓存框架 (opens new window)
  • jetcache java 缓存框架 (opens new window)
  • caffeine 缓存框架 (opens new window)
  • Spring Cache (opens new window)
  • 主流缓存框架调研 (opens new window)
  • redisson 官方中文文档 (opens new window)
  • LiquiBase 中文学习指南 (opens new window)
  • LiquiBase 官方文档 (opens new window)
  • 分类
  • 归档
GitHub (opens new window)

bombax

小小程序猿
首页
  • 前置

    • 尚硅谷Java学习
    • 基础软件安装与配置
  • 核心

    • Java从入门到精通(JDK17版)
    • MySQL从入门到高级-基础篇
    • MySQL从入门到高级-高级篇
    • JDBC 核心技术(JDK21版)
    • JavaWeb 技术
  • 学习笔记

    • POJO 概念
  • Spring Cloud

    • SpringCloud
    • SpringCloud-Alibaba
  • 持久层框架

    • MyBatis
    • MyBatis-Plus
  • 相关知识

    • Mybatis 代码生成工具比较
  • 安全框架

    • 安全框架之 Spring Security
    • 安全框架之 Shiro
  • 定时任务框架

    • 定时任务框架之 Quartz
    • 定时任务框架之 XXL-JOB
  • Java 日志热门框架
  • Git 常用命令
  • Swagger API 文档生成工具
  • Motan RPC (opens new window)
  • Lombok Tutorial (opens new window)
  • Lombok Features (opens new window)
  • FastJSON2 (opens new window)
  • Spring Framework 5 中文文档 (opens new window)
  • XStream (opens new window)
  • fluent-validator 业务逻辑验证框架 (opens new window)
  • ehcache java 缓存框架 (opens new window)
  • jetcache java 缓存框架 (opens new window)
  • caffeine 缓存框架 (opens new window)
  • Spring Cache (opens new window)
  • 主流缓存框架调研 (opens new window)
  • redisson 官方中文文档 (opens new window)
  • LiquiBase 中文学习指南 (opens new window)
  • LiquiBase 官方文档 (opens new window)
  • 分类
  • 归档
GitHub (opens new window)
  • 前置

  • 核心

    • Java从入门到精通(JDK17版)

    • MySQL从入门到高级-基础篇

    • MySQL从入门到高级-高级篇

      • 第00章_写在前面
      • 第01章_Linux 下 MySQL 的安装与使用
      • 第02章_MySQL 的数据目录
        • 1. MySQL8 的主要目录结构
          • 1.1 数据库文件的存放路径
          • 1.2 相关命令目录
          • 1.3 配置文件目录
        • 2. 数据库和文件系统的关系
          • 2.1 查看默认的数据库
          • 2.2 数据库在文件系统中的表示
          • 2.3 表在文件系统中的表示
          • InnoDB 存储引擎模式
          • MyISAM 存储引擎模式
          • 总结
          • 2.4 视图在文件系统中的表示
          • 2.5 其他的文件
      • 第03章_用户与权限管理
      • 第04章_逻辑架构
      • 第05章_存储引擎
      • 第06章_索引的数据结构
      • 第07章_InnoDB 数据存储结构
      • 第08章_索引的创建与设计原则
      • 第09章_性能分析工具的使用
      • 第10章_索引优化与查询优化
      • 第11章_数据库的设计规范
      • 第12章_数据库其它调优策略
      • 第13章_事务基础知识
      • 第14章_MySQL 事务日志
      • 第15章_锁
      • 第16章_多版本并发控制
      • 第17章_其它数据库日志
      • 第18章_主从复制
      • 第19章_数据库备份与恢复
    • JDBC 核心技术(JDK21版)
    • JavaWeb技术

  • 学习笔记

  • Java基础
  • 核心
  • MySQL从入门到高级-高级篇
bombax
2025-05-14
目录

第02章_MySQL 的数据目录

# 第 02 章 MySQL 的数据目录

# 1. MySQL8 的主要目录结构

find / -name mysql
1

# 1.1 数据库文件的存放路径

MySQL 数据库文件的存放路径:/var/lib/mysql

数据目录对应系统变量 datadir

show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1
2
3
4
5
6

# 1.2 相关命令目录

相关命令目录:/usr/bin 和 /usr/sbin。

/usb/bin 目录包含 mysqladmin、mysqlbinlog、mysqldump 等命令。

cd /usr/bin
find . -name "mysqladmin*"
find . -name "mysqldump*"
1
2
3

# 1.3 配置文件目录

配置文件目录:/usr/share/mysql-8.0(命令及配置文件),/etc/mysql(如 my.cnf)

# 2. 数据库和文件系统的关系

文件系统是操作系统用来管理磁盘的结构;

InnoDB、MyISAM 等存储引擎将表存储在文件系统上,负责数据的读取和写入;

本节的内容介绍 InnoDB、MyISAM 这两个存储引擎的如何在文件系统中存储数据。

# 2.1 查看默认的数据库

SHOW DATABASES;
1

有 4 个数据库是属于 MySQL 自带的系统数据库

  • mysql

    MySQL 系统自带的核心数据库,它存储了 MySQL 的用户账户和权限信息,一些存储过程、事件的定义信息,一些运行过程中产生的日志信息,一些帮助信息以及时区信息等。

  • information_schema

    MySQL 系统自带的数据库,这个数据库保存着 MySQL 服务器维护的所有其他数据库的信息,比如有哪些表、哪些视图、哪些触发器、哪些列、哪些索引。这些信息并不是真实的用户数据,而是一些描述性信息,有时候也称之为元数据。在系统数据库information_schema中提供了一些以innodb_sys开头的表,用于表示内部系统表。

  • performance_schema

    MySQL 系统自带的数据库,这个数据库里主要保存 MySQL 服务器运行过程中的一些状态信息,可以用来监控 MySQL 服务的各类性能指标。包括统计最近执行了哪些语句,在执行过程的每个阶段都花费了多长时间,内存的使用情况等信息。

  • sys

    MySQL 系统自带的数据库,这个数据库主要是通过视图的形式把information_schema和performance_schema结合起来,帮助系统管理员和开发人员监控 MySQL 的技术性能。

# 2.2 数据库在文件系统中的表示

每个数据库都对应着数据目录下的一个子目录,或者说一个文件夹。

当使用CREATE DATABASE 语句新建数据库时,MySQL 会做两件事:

  • 在数据目录下创建一个和数据库同名的子目录;
  • 在与该数据库同名的子目录下创建一个名为db.opt的文件(仅限 MySQL5.7 及之前的版本),这个文件中包含了该数据库的各种属性,比如该数据库的字符集和比较规则。
# MySQL 5.7
dataname.frm
dataname.idb
db.opt

# MySQL 8.0
dataname.idb
1
2
3
4
5
6
7

提示

除了information_schema 系统数据库外,其他的数据库在数据目录下都有对应的子目录。

# 2.3 表在文件系统中的表示

数据是以记录的形式插入到表中,每个表的信息可以分为两种:

  • 表的结构的定义
  • 表中的数据

表结构就是该表的名称,表里面有多少列,每个列的数据类型,约束条件和索引,使用的字符集和比较规则等信息,这些信息都体现在了建表语句中。

# InnoDB 存储引擎模式

1. 表结构

为了保存表结构,InnoDB在数据目录下对应的数据库子目录下创建了一个专门用于描述表结构的文件:表名.frm form 表单

.frm文件的格式在不同的平台上都是相同的。这个后缀名为 .frm 是以二进制格式存储的,直接打开是乱码的。

提示

MySQL8.0 中不再单独提供 表名.frm,而是合并在表名.ibd文件中。

2. 表中数据和索引

InnoDB 是以页为基本单位来管理存储空间的。

为了更好的管理页,InnoDB 提出了一个表空间或者文件空间(英文名:table space 或者 file space)的概念,表空间是一个抽象概念,它可以对应文件系统上一个或多个真实文件(不同表空间对应的文件数可能不同)。每一个表空间可以被划分为多个页,我们的表数据就存放在某个表空间下的某些页里。

表空间的类型

① 系统表空间(system tablespace)

默认情况下,InnoDB 会在数据目录下创建一个名为ibdata1、大小为12M的自拓展文件,这个文件就是对应的系统表空间在文件系统上的表示。

当然,如果你想让系统表空间对应文件系统上多个实际文件,或者仅仅觉得原来的 ibdata1 这个文件名难听,那可以在 MySQL 启动时配置对应的文件路径以及它们的大小,比如这样修改一下 my.cnf 配置文件:

# 修改系统表空间文件名、文件数量、初始大小
[server]
innodb_data_file_path=data1:512M;data2:512M:autoextend
1
2
3

这样在 MySQL 启动之后,就会创建这两个 512M 大小的文件作为系统表空间,其中的 autoextend 表示这两个文件如果不够用会自动拓展 data2 文件的大小。

在一个 MySQL 服务器中,系统表空间只有一份。从 MySQL5.5.7 到 MySQL5.6.6 之间的各个版本中,表中的数据都会被默认存储到这个系统表空间中。

② 独立表空间(file-per-table tablespace)

在 MySQL5.6.6 以及之后的版本中,InnoDB 并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,即创建了多少个表,就有多少个独立表空间。使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,文件后缀.ibd 。

表名.ibd InnoDB Data

③ 系统表空间与独立表空间的设置

我们可以自己指定使用系统表空间还是独立表空间来存储数据,这个功能由启动参数innodb_file_per_table控制。

[server] 
innodb_file_per_table=0 # 0:代表使用系统表空间; 1:代表使用独立表空间
1
2

默认情况

mysql> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1
2
3
4
5
6

innodb_file_per_table参数的修改只对新建的表起作用,对于已经分配了表空间的表不起作用。

修改表所属的表空间

# 把已经存在系统表空间中的表转移到独立表空间
ALTER TABLE 表名 TABLESPACE [=] innodb_file_per_tables;
# 把已经存在独立表空间中的表转移到系统表空间
ALTER TABLE 表名 TABLESPACE [=] innodb_system;
# 其中等于号=可以省略
1
2
3
4
5

④ 其他类型的表空间

随着 MySQL 的发展,除了上述两种老牌表空间之外,现在还新提出了一些不同类型的表空间,比如通用表空间(general tablespace)、临时表空间(temporary tablespace)等。

3. .frm 文件

.frm文件在 MySQL8 中不存在,Oracle 官方将 frm 文件的信息以及更多的信息统称为序列化字典信息(Serialized Dictionary Information,SDI),并将 SDI 写在 ibd 文件内部。

Oracle 提供了一个应用程序 ibd2sdi,可以从 IBD 文件中提取 SDI 信息。

查看表结构

到存储 ibd 文件的目录下,执行以下命令

命令执行后,ibd2sdi 会将 ibd 文件里存储的表结构以 json 的格式保存在 txt 文件中

ibd2sdi --dump-file=student.txt student.ibd
more student.txt
1
2

# MyISAM 存储引擎模式

1. 表结构

在存储表结构方面,MyISAM 和 InnoDB一样,也是在数据目录下对应的数据库子目录下创建了一个专门用于描述表结构的文件

表名.frm
1
2. 表中数据和索引

在 MyISAM 中的索引全部都是二级索引,该存储引擎的数据和索引是分开存放的。所以在文件系统中也是使用不同的文件来存储数据文件和索引文件,同时表数据都存放在对应的数据库子目录下。

假设test表使用 MyISAM 存储引擎,它所在数据库对应的atguigu目录下会为test表创建这三个文件

test.frm 存储表结构 # MySQL8.0 改为了 test_xxx.sdi
test.MYD 存储数据 (MYData) 
test.MYI 存储索引 (MYIndex)
1
2
3

举例:创建一个MyISAM表,使用ENGINE选项显式指引擎。因为InnoDB是默认引擎

CREATE TABLE `student` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(15) DEFAULT NULL
) ENGINE=MYISAM DEFAULT CHARSET=utf8 ;
1
2
3
4
# MySQL5.7.26
student.frm
student.MYD
student.MYI

# MySQL8.0.25
student_361.sdi
student.MYD
student.MYI
1
2
3
4
5
6
7
8
9

# 总结

1. InnoDB

  • 表结构 .frm mysql8.0 不存在,合并到.ibd文件中。
  • 表数据和索引
    • 如果采用系统表空间模式,数据信息和索引信息都存储在 ibdata1 中
    • 如果采用独立表空间模式,数据信息和索引信息都存储在 .ibd 中
  • db.opt 数据库相关信息,比如字符集和比较规则 mysql8.0 不存在。

2. MyISAM

  • 表结构
    • MySQL5.7 .frm
    • MySQL8.0 .sdi
  • 表数据信息 .MYD
  • 表数据索引 .MYI

# 2.4 视图在文件系统中的表示

视图是虚拟的表,不存储真实的数据,只存储结构。

和表一样,描述视图结构的文件也会被存储到所属数据库对应的子目录下,只存储一个视图名.frm文件。

# 2.5 其他的文件

为了更好的运行程序,除了用户自己存储的数据以外,数据目录下还包括一些额外的文件:

  • 服务器进程文件

    每运行一个 MySQL 服务器程序,都意味着启动一个进程。MySQL 服务器会把自己的进程 ID 写入到一个文件中。

  • 服务器日志文件

    查询日志、错误日志、二进制日志、redo 日志等。

  • 默认/自动生成的 SSL 和 RSA 证书和密钥文件

    主要是为了客户端和服务端安全通信而创建的一些文件。

上次更新: 2025/06/18, 23:09:08
第01章_Linux 下 MySQL 的安装与使用
第03章_用户与权限管理

← 第01章_Linux 下 MySQL 的安装与使用 第03章_用户与权限管理→

最近更新
01
第九章 前端工程化-下
12-11
02
第八章 前端工程化-中
12-11
03
第七章 前端工程化-上
12-04
更多文章>
Theme by Vdoing | Copyright © 2024-2026 bombax | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式