MySQL:数据目录解析

12/31/2023 后端数据库MySQL

目录


参考:


# MySQL:数据目录解析

# 文件系统

存储引擎 InnoDB、 MyISAM 都是把表存储在文件系统上的。当读取数据的时候,存储引擎会从文件系统中把数据读出来返回,当写入数据的时候,存储引擎会把数据又写回文件系统。

# 数据目录

MySQL服务器程序在启动时会到文件系统的某个目录下加载一些文件,之后在运行过程中产生的数据也都会存储到这个目录下的某些文件中,这个目录就称为数据目录。MySQL数据目录是存放数据库文件的核心路径。

# 数据目录的位置

  • 查看数据目录的路径:数据目录对应着一个系统变量datadir,可以通过在MySQL命令查看数据目录位置。

    # 查看数据目录
    show global variables like "%datadir%";
    
    1
    2
  • 修改数据目录路径的方法:如果需要更改数据目录的存储位置,比如由于存储规划的需要,可以通过修改MySQL的配置文件(在Linux中通常是/etc/my.cnf/etc/mysql/my.cnf,在Windows中则可能位于MySQL安装目录下)并查找datadir属性来实现。

# 数据目录的结构

# 数据库

每个数据库都对应数据目录下的一个子目录,或者说对应一个文件夹,每当新建一个数据库时,MySQL会做以下事:

  • 在数据目录下创建一个和数据库名同名的子目录(或者说是文件夹)。
  • 在该与数据库名同名的子目录下创建一个名为db.opt的文件,这个文件中包含了该数据库的各种属性,比如:该数据库的字符集和比较规则等。

注意:除了information_schema这个系统数据库外,其他的数据库在数据目录下都有对应的子目录。information_schema比较特殊,MySQL设计师对它的实现进行了特殊对待,没有使用相应的数据库目录。

# 表结构

数据是以记录的形式插入到表中的,每个表的信息其实可以分为两种:表结构的定义、表中的数据。

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

InnoDBMyISAM这两种存储引擎都在***数据目录下对应的数据库子目录下创建了一个专门用于描述表结构的文件:表名.frm。***

# 表数据

不同的存储引擎表数据保存的文件有所不同:

# InnoDB是如何存储表数据的

InnoDB是使用页为基本单位来管理存储空间的,为了更好的管理这些页,InnoDB设计师提出了一个表空间(文件空间)的概念。表空间是一个抽象的概念,它可以对应文件系统上一个或多个真实文件(不同表空间对应的文件数量可能不同),表数据就存放在某个表空间下的某些页里。

表空间划分为几种不同的类型,主要的如下:

  • # 系统表空间(system tablespace)

    默认情况下,InnoDB会在数据目录下创建一个名为ibdata1、大小为12M的文件,这个文件就是对应的系统表空间在文件系统上的表示。这个文件是自扩展文件,也就是当不够用的时候它会自己增加文件大小。

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

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

    在MySQL5.6.6以及之后的版本中InnoDB并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说创建了多少个表,就有多少个独立表空间。

    使用独立表空间来存储表数据的话,会***在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件:表名.ibd。***

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

[server]
# 值为`0`时,代表使用系统表空间;值为`1`时,代表使用独立表空间。
innodb_file_per_table=0
1
2
3

注意:innodb_file_per_table参数只对新建的表起作用,对于已经分配了表空间的表并不起作用。

  • 把已经存在系统表空间中的表转移到独立表空间,可以使用下面的语法([=]表示=可以省略):

    ALTER TABLE 表名 TABLESPACE [=] innodb_file_per_table;
    
    1
  • 把已经存在独立表空间的表转移到系统表空间,可以使用下面的语法([=]表示=可以省略):

    ALTER TABLE 表名 TABLESPACE [=] innodb_system;
    
    1
# MyISAM是如何存储表数据的
  • MyISAM中的索引全部都是二级索引,该存储引擎的数据和索引是分开存放的(InnoDB的索引和数据是一个)。所以在文件系统中也是***使用不同的文件来存储数据文件和索引文件***。
  • MyISAM没有表空间的概念,表数据都存放到对应的数据库子目录下

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

test.frm
test.MYD
test.MYI
1
2
3
  • test.frm代表表的结构;
  • test.MYD代表表的数据文件,也就是我们插入的用户记录;
  • test.MYI代表表的索引文件,我们为该表创建的索引都会放到这个文件中。

# 视图

MySQL中的视图其实是虚拟的表,也就是某个查询语句的一个别名而已,所以在存储视图的时候是不需要存储真实的数据的,只需要把它的结构存储起来就行了。

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

# 其他

除了上面说的这些用户自己存储的数据以外,数据目录下还包括为了更好运行程序的一些额外文件,主要包括这几种类型的文件:

  • 服务器进程文件。 每运行一个MySQL服务器程序,都意味着启动一个进程。MySQL服务器会把自己的进程ID写入到一个文件中。
  • 服务器日志文件。 在服务器运行过程中,会产生各种各样的日志,比如常规的查询日志、错误日志、二进制日志、redo日志等等各种日志。
  • 默认自动生成的SSL和RSA证书和密钥文件 主要是为了客户端和服务器安全通信而创建的一些文件。
上次更新时间: 11/13/2024, 8:26:38 AM