文章

MySQL 数据目录

MySQL 数据目录结构

MySQL 服务器程序在启动时会到文件系统的某个目录下加载一些文件,之后在运行过程中产生的数据也都会存储到这个目录下的某些文件中,这个目录就称为数据目录,它对应一个系统变量 datadir:

可以看到,我电脑上的 MySQL 数据目录为 /Users/luyee/apps/mysql/data/

数据库在数据目录中的表示

每个数据库都对应数据目录下的一个子目录,比如我创建了一个 test 数据库:

可以看到数据目录下确实多了个 test 子目录,除此之外,还能看到有 mysqlperformance_schemasys 这几个数据库,我们连接到 MySQL 查询所有数据库确认下: 

仔细看的话,发现除了 information_schema 这个系统数据库外,其他的数据库在数据目录下都有对应的子目录,这是因为 MySQL 的开发者对 information_schema 的进行了特殊对待。 

我们回到刚刚创建的 test 数据库,查看 test 子目录,发现其下存在一个名为 db.opt 的文件,这个文件用来存储该数据库的各种元数据,如该数据库的默认字符集和默认字符比较规则:

表在数据目录中的表示

每张表的数据可以分成两个部分:

  1. 表结构定义

  2. 表中的数据

在 InnoDB 中,数据库子目录下的 <表名>.frm 文件就是表结构定义文件,`<表名>.ibd 文件`是存储表中数据的文件,比如我们在 test 数据库下创建一个 index_demo 表:

InnoDB 是如何存储表数据的

我们已经知道 InnoDB 是以页为单位来管理存储空间的,为了更好地管理这些页,InnoDB 开发者提出了一个表空间(table space)的概念,这是一个抽象的概念,一个表空间对应了文件系统上的一个或多个真实文件。

表空间分为以下类型:

表空间

说明

系统表空间(system tablespace)

也叫共享表空间,对应数据目录下的 ibdata1 文件。从 MySQL 5.5.7 到 

MySQL 5.6.6, InnoDB 会默认把各个表的数据存储到系统表空间中。

独立表空间(file-per-table tablesapce)

在 MySQL 5.6.6 及之后的版本中,InnoDB 系统变量 innodb_file_per_table 的值默认是 ON,即会为每张表都创建一个独立表空间。此时,表数据存放在 <表名>.ibd 这个文件中。

通用表空间(general tablespace)

用于存储多个 InnoDB 表的数据和索引,适用于 MySQL 5.7 及以上版本,相比系统表空间有更大的灵活性,可以将多个表的数据存储在一个共享的表空间中。

undo表空间(undo tablespace)

用于存储事务的 undo 日志,通常存储在 ibdata1 中,从 MySQL 5.6 开始,你也可以通过 innodb_undo_directoryinnodb_undo_tablespaces 这两个参数来配置独立的 undo 表空间。

临时表空间(temporary tablespace)

用于存储临时表和复杂查询过程中的临时数据,通常存储在 ibtmp1 文件中,从 MySQL 8.0 开始,你也可以通过 innodb_temp_tablespace_dirinnodb_temp_tablespaces 这两个参数来配置独立的临时表空间。

视图在数据目录中的表示

MySQL 视图是一种虚拟表,定义了从一个或多个表中提取数据的查询。它不存储数据本身,只是保存了查询逻辑,用来简化复杂查询,避免每次都编写复杂的查询语句。

由于不存储数据本身,因此只需要把它的结构存储起来就行了,即存储到数据库子目录的 <视图名>.frm 文件

其他文件在数据目录中的表示

除了我们上面提到的文件,数据目录还存储了一些程序运行需要的文件,如:

(1) 服务器进程文件:<hostname>.pid

(2) 服务器日志文件

  1. MySQL 错误日志文件:<hostname>.err

(3) 自动生成的SSL和RSA证书和密钥文件 :ca.pem、ca-key.pem、client-key.pem、client-cert.pem、server-key.pem、server-cert.pem、private_key.pem、public_key.pem

(4) 自动生成的配置文件:auto.cnf(包含 MySQL 服务器的 UUID,用于 MySQL 的复制和集群功能)

(5) InnoDB 独有文件

  1. 缓冲池文件:ib_buffer_pool,用于缓存数据库页,减少磁盘 I/O,从而提高数据库性能。可以通过 innodb_buffer_pool_size 参数设置 InnoDB 缓冲池的大小,可以通过 innodb_buffer_pool_instances 参数将缓冲池划分为多个实例,以减少竞争并提高性能

  2. InnoDB redo log 文件:ib_logfile0ib_logfile1,记录了对数据库的所有修改操作,以便在系统崩溃时进行数据恢复。可以通过 innodb_log_file_size 参数调整 redo log 文件的大小,也可以通过 innodb_log_files_in_group 参数来增加日志文件的数量

文件系统对 MySQL 的制约

  1. 数据库名称和表名称受文件系统最大长度限制

  2. 文件长度受文件系统最大长度限制

  3. 特殊字符的问题:MySQL 会自动把除数字和字母以外的字符转化成 @Unicode编码 的形式,如创建一张名叫`用户表`的表,其表空间文件为:@7528@6237@8868.frm@7528@6237@8868.ibd

MySQL系统数据库

数据库

说明

information_schema

存储 MySQL 所有其他数据库的元数据信息,比如有哪些表、哪些视图、哪些触发器、哪些列、哪些索引等。

mysql

存储 MySQL 的用户账户和权限信息、存储过程和事件的定义信息、运行过程中产生的日志信息、帮助信息以及时区信息等。

performance_schema

存储 MySQL 运行过程中的一些状态信息,包括最近执行了哪些语句,在执行过程的每个阶段都花费了多长时间,内存的使用情况等。 

sys

通过视图的形式把 information_schema 和 performance_schema 结合起来,提供了一些用于管理和诊断 MySQL 的视图和存储过程,帮助管理员更轻松地监控和维护数据库。

License:  CC BY 4.0