MySQL 的数据目录
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. 数据库和文件系统的关系
操作系统用来管理磁盘的结构被称为 文件系统
InnoDB
、MyISAM
存储引擎都是将表存储到磁盘中;换句话说是 将表存储在文件系统上
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 存储引擎模式
-
表结构
在 InnoDB 中,数据库目录的子目录(表的同级)中会创建一个 存储表结构的文件
表名.frm
文件是以二进制格式
进行存储的,无法直接打开 -
表中数据和索引
- 系统表空间(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 存储引擎模式
-
表结构
存储表结构时,MyISAM 和 InnoDB 一致,都是在数据库的子目录中创建文件
表名.frm
-
表中数据和索引
MyISAM 中的索引都是二级索引
,该存储引擎的数据和索引是分开存放的
若使用 MyISAM 存储引擎,则会在数据库所对应的文件目录下创建这三个文件
文件名 | 描述 |
---|---|
表名.frm | 存储表结构 |
表名.MYD | 存储数据(MYData) |
表名.MYI | 存储索引(MYIndex) |
2.4 小结
- 若采用
InnoDB
表名.frm
:存储表结构- 若使用
系统表空间
存储模式,则数据信息和索引都存储在ibdata1
中 - 若使用
独立表空间
存储模式,则还会有表名.ibd
文件(存储索引信息和数据信息)
MySQL 5.7 还有
表名.opt
文件保存数据库相关配置(字符集,比较规则)。MySQL8不提供
MySQL8.0 不再单独提供表名.frm
而是合并到表名.ibd
文件中
MySQL 5.7 有 .frm 和 .opt (和 .ibd )文件
MySQL 8 有 .ibd 文件
- 使用
MyISAM
- MySQL 5.7 中
表名.frm
:描述表结构文件 - MySQL 8 中
表名.xxx.sdi
:描述表结构文件 表名.MYD
(MYData):数据信息文件,存储数据信息(若使用独立表存储模式)表名.MYI
(MYIndex):存放索引信息文件
- MySQL 5.7 中