1. MySQL8 的主要目录结构

find / -name mysql

1.1 数据库文件的存放路径

/var/lib/mysql

mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.04 sec)

1.3 配置文件目录

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

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

操作系统用来管理磁盘的结构被称为 文件系统
InnoDBMyISAM 存储引擎都是将表存储到磁盘中;换句话说是 将表存储在文件系统上

2.1 自带的数据库

SHOW DATABASES;
MySQL 有 4 个自带的系统数据库

  • mysql
    核心数据库,存储MySQL用户账户和权限信息,一些存储过程、事件定义信息、一些日志信息、帮助信息以及时区信息等
  • information_schema
    此库,保存着 MySQL 服务器维护的所有其他数据库信息,例如:有哪些表、视图、触发器、字段、索引。并不是真实的数据,而是描述性信息,也称为 元数据
  • performance_schema
    主要保存 MySQL 服务器运行中的状态信息,可以用来 监控 MySQL 服务器的各类性能指标。包括统计最近执行了哪些语句,在执行过程的每个阶段都花费了多长时间,内存的使用情况等信息。
  • sys
    这个数据库主要是通过 视图 的形式把 information_schema 和performance_schema 结合起来,帮助系统管理员和开发人员监控 MySQL 的技术性能。

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

MySQL 5.7 中的 temp 数据库

[root@xyz mysql]# cd /var/lib/mysql
[root@xyz mysql]# cd ./temp
[root@xyz temp]# ll
总用量 1144
-rw-r-----. 1 mysql mysql 8658 8月 18 11:32 countries.frm
-rw-r-----. 1 mysql mysql 114688 8月 18 11:32 countries.ibd
-rw-r-----. 1 mysql mysql 61 8月 18 11:32 db.opt
-rw-r-----. 1 mysql mysql 8716 8月 18 11:32 departments.frm
-rw-r-----. 1 mysql mysql 147456 8月 18 11:32 departments.ibd
-rw-r-----. 1 mysql mysql 3017 8月 18 11:32 emp_details_view.frm
-rw-r-----. 1 mysql mysql 8982 8月 18 11:32 employees.frm
-rw-r-----. 1 mysql mysql 180224 8月 18 11:32 employees.ibd
-rw-r-----. 1 mysql mysql 8660 8月 18 11:32 job_grades.frm
-rw-r-----. 1 mysql mysql 98304 8月 18 11:32 job_grades.ibd
-rw-r-----. 1 mysql mysql 8736 8月 18 11:32 job_history.frm
-rw-r-----. 1 mysql mysql 147456 8月 18 11:32 job_history.ibd
-rw-r-----. 1 mysql mysql 8688 8月 18 11:32 jobs.frm
-rw-r-----. 1 mysql mysql 114688 8月 18 11:32 jobs.ibd
-rw-r-----. 1 mysql mysql 8790 8月 18 11:32 locations.frm
-rw-r-----. 1 mysql mysql 131072 8月 18 11:32 locations.ibd
-rw-r-----. 1 mysql mysql 8614 8月 18 11:32 regions.frm
-rw-r-----. 1 mysql mysql 114688 8月 18 11:32 regions.ibd

MySQL8.0

[root@xyz mysql]# cd ./temp
[root@xyz temp]# ll
总用量 1080
-rw-r-----. 1 mysql mysql 131072 7月 29 23:10 countries.ibd
-rw-r-----. 1 mysql mysql 163840 7月 29 23:10 departments.ibd
-rw-r-----. 1 mysql mysql 196608 7月 29 23:10 employees.ibd
-rw-r-----. 1 mysql mysql 114688 7月 29 23:10 job_grades.ibd
-rw-r-----. 1 mysql mysql 163840 7月 29 23:10 job_history.ibd
-rw-r-----. 1 mysql mysql 131072 7月 29 23:10 jobs.ibd
-rw-r-----. 1 mysql mysql 147456 7月 29 23:10 locations.ibd
-rw-r-----. 1 mysql mysql 131072 7月 29 23:10 regions.ibd

2.3 表在文件系统中的表示

2.3.1 InnoDB 存储引擎模式

  1. 表结构
    在 InnoDB 中,数据库目录的子目录(表的同级)中会创建一个 存储表结构的文件
    表名.frm
    文件是以二进制格式进行存储的,无法直接打开

  2. 表中数据和索引

  • 系统表空间(system tablespace)
    默认情况下 InnoDB 会在数据库目录下创建 名为ibdata1、大小为 12M 的文件。
    这个文件 就是 系统表空间 在文件系统中的表示。12M,此文件是自扩展文件

可以在 my.cnf 配置文件中修改 此文件的文件名和文件大小
在服务器中只有一份系统表空间,MySQL 5.5.7 到 5.6.6 之间的各个版本中,我们表中数据都会默认存储到这个系统表空间

[server]
innodb_data_file_path = data1:512M;data2:512M:autoextend
  • 独立表空间(file-per-table tablespace)
    在 MySQL 5.6.6 及以后的版本中,InnoDB 并不会将数据存在系统表空间中,而是:将每个表建立一个独立表空间。表空间文件在其数据库的子目录下(与表同级)
    表名.ibd

例如:使用独立表空间去存储 temp 数据库的 test 表,则 temp 目录中会为 test 表创建两个文件

test.frm
test.ibd

其中 test.ibd 文件 存储 test表中的数据和索引

  • 系统表空间与独立表空间的设置
    可以 指定使用 系统表空间独立表空间 来存储数据
[server]
innodb_file_per_table=0 #0:使用系统表空间   1:使用独立表空间

默认情况:

mysql> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.01 sec)
  • 其他类型的表空间
    通用表空间(general tablespace)、临时表空间(temporary tablespace)

  • 查看 ibd 文件方法
    在存储 ibd 文件的目录中
    ibd2sdi --dump-file=表名.txt 表名.ibd

2.3.2 MyISAM 存储引擎模式

  1. 表结构
    存储表结构时,MyISAM 和 InnoDB 一致,都是在数据库的子目录中创建文件
    表名.frm

  2. 表中数据和索引
    MyISAM 中的索引都是 二级索引,该存储引擎的 数据和索引是分开存放的
    若使用 MyISAM 存储引擎,则会在数据库所对应的文件目录下创建这三个文件

文件名 描述
表名.frm 存储表结构
表名.MYD 存储数据(MYData)
表名.MYI 存储索引(MYIndex)

2.4 小结

  1. 若采用 InnoDB
    • 表名.frm :存储表结构
    • 若使用 系统表空间 存储模式,则数据信息和索引都存储在 ibdata1
    • 若使用 独立表空间 存储模式,则还会有 表名.ibd 文件(存储索引信息和数据信息)

MySQL 5.7 还有 表名.opt 文件保存数据库相关配置(字符集,比较规则)。MySQL8不提供
MySQL8.0 不再单独提供 表名.frm 而是合并到 表名.ibd 文件中

MySQL 5.7 有 .frm 和 .opt (和 .ibd )文件
MySQL 8 有 .ibd 文件

  1. 使用 MyISAM
    • MySQL 5.7 中表名.frm :描述表结构文件
    • MySQL 8 中表名.xxx.sdi:描述表结构文件
    • 表名.MYD(MYData):数据信息文件,存储数据信息(若使用独立表存储模式)
    • 表名.MYI(MYIndex):存放索引信息文件
文章作者: 临川
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 临川羡鱼
MySQL MySQL
喜欢就支持一下吧