1. 主要目录结构
MySQL数据库文件存放路径: /var/lib/mysql
mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
该文件夹下的文件如下
root@e6c4aa557f23:/var/lib/mysql# ls
auto.cnf client-key.pem ibdata1 private_key.pem sys
ca-key.pem ib_buffer_pool ibtmp1 public_key.pem
ca.pem ib_logfile0 mysql server-cert.pem
client-cert.pem ib_logfile1 performance_schema server-key.pem
2.数据库和文件系统的关系
2.1 默认数据库
MySQL有四个默认数据库,如下
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
- mysql
MySQL系统自带的核心数据库,它存储了MySQL的用户账户
和权限信息
,一些存储过程、事件的定义信息,一些运行过程中产生的日志信息,一些帮助信息以及时区信息。
- information_schema
MySQL系统自带的数据库,保存着MySQL服务器维护所有其他数据库的信息
,比如有哪些表,哪些视图,哪些触发器,哪些列,哪些索引等。这些不是真实用户数据,而是描述信息,也被称为元数据
。在系统数据information_schema中提供了一些以innodb_sys开头的表,用于表示内部系统表。
# 表名区分大小写。
mysql> show tables like 'INNODB_SYS%'
-> ;
+--------------------------------------------+
| Tables_in_information_schema (INNODB_SYS%) |
+--------------------------------------------+
| INNODB_SYS_DATAFILES |
| INNODB_SYS_VIRTUAL |
| INNODB_SYS_INDEXES |
| INNODB_SYS_TABLES |
| INNODB_SYS_FIELDS |
| INNODB_SYS_TABLESPACES |
| INNODB_SYS_FOREIGN_COLS |
| INNODB_SYS_COLUMNS |
| INNODB_SYS_FOREIGN |
| INNODB_SYS_TABLESTATS |
+--------------------------------------------+
10 rows in set (0.00 sec)
- performance_schema
MySQL系统自带的数据库,这个数据库里主要保存MySQL服务器运行过程中的一些状态信息,可以用来监控MySQL服务的各类性能指标
。包括最近执行哪些语句,执行过程中每个阶段花费的时间,内存的使用情况等。
- sys
MySQL系统自带的数据库,主要是通过视图
的形式把information_schema
和performance_schema
结合起来,帮助开发人员监控MySQL的性能。
2.2 数据库在文件系统的表示
数据库目录内容如下:
root@e6c4aa557f23:/var/lib/mysql# cd /var/lib/mysql
root@e6c4aa557f23:/var/lib/mysql# ls
auto.cnf client-key.pem ibdata1 private_key.pem sys
ca-key.pem ib_buffer_pool ibtmp1 public_key.pem
ca.pem ib_logfile0 mysql server-cert.pem
client-cert.pem ib_logfile1 performance_schema server-key.pem
这个数据目录下的文件和子目录比较多,除了information_schema这个系统数据库外,其他的数据库在数据目录
下都有对应的子目录。
以自定义的数据库test01为例:
root@e6c4aa557f23:/var/lib/mysql/test01# ls
db.opt human.frm human.ibd
包括有三个文件
- opt文件: MySQL5.7 中会在
每个数据库
的目录下生成 db.opt 文件用于保存数据库的相关配置。比如:字符集、比较规则。而MySQL8.0不再提供db.opt文件。 - **frm文件:**用于描述表结构的文件。.frm文件的格式在不同的平台都是一样的。是以二进制的形式存储的,直接打开是乱码。
- ibd文件:
- **系统表空间:**默认情况下,InnoDB会在数据库目录下创建一个名为ibdata1、大小12M的文件,即为系统表空间在文件系统上的表示。该文件是一个
自扩展文件
,容量不足会自己扩展。 - **独立表空间:**从MySQL5.6.6开始,InnoDB不再把表数据存储到系统表空间,而实为每个表建立独立表空间。而这个独立表空间
对应的文件就是.ibd文件
。其中存储了对应的表中的数据和索引。
- **系统表空间:**默认情况下,InnoDB会在数据库目录下创建一个名为ibdata1、大小12M的文件,即为系统表空间在文件系统上的表示。该文件是一个
我们可以自己指定使用 系统表空间 还是 独立表空间 来存储数据,这个功能由启动参数 innodb_file_per_table 控制,比如说我们想将表数据都存储到 系统表空间 时,可以在启动 MySQL服务器的时候这样配置:
[server]
innodb_file_per_table=0 # 0:代表使用系统表空间; 1:代表使用独立表空间
默认情况
mysql> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON | # ON表示使用独立表空间
+-----------------------+-------+
1 row in set (0.00 sec)
MySQL 8.0将ibd文件和frm文件合并,只有一个ibd文件,并且不再提供db.opt文件,其中的字符集、比较规则信息也放在ibd文件中。
2.3 MyISAM的存储模式
2.3.1表结构
MyISAM和InnoDB一模一样,也是在数据目录下对应的数据库子目录下创建一个专门描述表结构的文件,即表名.frm
。
2.3.2 数据和索引
MyISAM中索引全都是二级索引
,该存储引擎的数据和索引分开存放。所以在文件系统中也使用了不同的文件来存储数据文件和索引文件,同时表数据都放在对应的数据库子目录下。
test.frm 存储表结构
test.MYD 存储数据 (MYData)
test.MYI 存储索引 (MYIndex)
过程中使用的版本为MySQL5.7.36
参考资料: 尚硅谷MySQL2022–宋红康