MySQL 持久化为文件

本文将介绍 MySQL 中数据库存储到文件中的处理方式。

一、数据库与文件的关系

MySQL 中的数据最终都会作为文件被存储在磁盘上。

二、数据目录与安装目录

MySQL 有两个重要的目录,

  • 安装目录:存放程序及执行命令
  • 数据目录:存储 MySQL 运行过程中产生的数据,包括数据库、表、视图、触发器、其它额外数据等

三、数据目录下的文件

1. 数据库

在 MySQL 中的每一个数据库对应数据目录下的一个子目录。

当我们创建数据库时,MySQL 会:

  • 在数据目录下创建一个与数据库同名的子文件夹

    后面称作 “数据库子文件夹”

  • 在该子文件夹下创建一个名为 db.opt 的文件,这个文件中会存储该数据库的各种属性

2. 表

表的数据可以分为两个部分:

  • 表的结构定义:

    如果存储引擎是 InnoDB 和 MyISAM,则 “数据库子文件夹” 下每个表会对应一个 表名.frm 文件,它用于描述表结构

  • 表数据:

    • 如果存储引擎是 InnoDB,数据以页为基本单位进行存储,页会被存储于 “表空间” 之中
      • “系统表空间”:在 MySQL 5.5.7 - 5.6.6 版本中,所有页都会被存储到 “系统表空间” 中,它对应 “数据目录” 下的 ibdata1 文件
      • “独立表空间”:在 MySQL 5.6.6 之后,InnoDB 会为每个表创建一个用于存储页的独立空间,它对应 “数据库子文件夹” 下的 表名.ibd 文件
    • 如果存储引擎是 MyISAM,由于 MyISAM 中的数据和索引分开存放,因此数据和索引会被分别存储到 “数据库子文件夹” 下的 表名.MYD表名.MYI

3. 视图

MySQL 中的视图实际上是虚拟的表,可以理解为查询语句的别名,存储视图时无需存储真实数据,只需要存储其结构。

因此,视图会被存储为 “数据库子文件夹” 下的 视图.crm

4. 其它文件

数据目录下还存在一些其它文件:

  • 服务器进程文件
  • 服务器日志文件
  • 安全通信文件:例如证书文件、密钥文件,用于在客户端与服务器通信时确保安全

四、存储对数据库的影响

由于 MySQL 的数据都存在文件系统中,因此将会收到文件系统的制约,例如:

  • 数据库名和表名的长度不得超过文件系统允许的最大文件夹名长度和文件名长度
  • 数据库名和表名映射到文件夹和文件时,特殊字符需要进行转义处理
  • 数据文件大小收到文件系统中文件最大大小的制约

参考

  • MySQL 技术内幕
  • MySQL 实战 45 讲
  • MySQL 是怎样运行的:从根儿上理解 MySQL