MySQL的数据目录
学习再总结宋红康老师课程内容
1.MySQL8的主要目录结构
安装好MySQL8之后,查看如下的目录结构
find / -name mysql
1.1数据库文件的存放路径
MySQL数据库文件的存放路径:/var/lib/mysql/
1.2相关命令目录
相关命令目录:/usr/bin(mysqladmin、mysqlbinlog、mysqldump等命令)和/usr/sbin。
1.3配置文件目录
配置文件目录:/usr/share/mysql-8.0(命令配置文件),/etc/mysql(my.cnf)
2.数据库和文件系统的关系
2.1查看默认数据库
查看一下在我的计算机上当前有哪些数据库:
SHOW DATABASES;
可以看到有4个数据库是属于MySQL自带的系统数据库
-
mysql
-
information_schema
-
performance_schema
MySQL系统自带的数据库,这个数据库主要保存MySQL服务器运行过程中的一些状态信息,可以用来监控MySQL服务的各类性能指标。包括统计最近执行了哪些语句,在执行过程的每个阶段都花费了多长时间,内存的使用情况等信息。 -
sys
MySQL系统自带的数据库,这个数据库主要是通过视图的形式把information_schema和performance_schema结合起来,帮助系统管理员和开发人员监控MySQL的技术性能。
2.2数据库在文件系统中的表示
1.在数据目录下创建一个和数据库名同名的子目录。
2.在与该数据库名同名的子目录下创建一个名为db.opt的文件(仅限MySQL5.7及之前版本),这个文件中包含了该数据库的各种属性,比如该数据库的字符集和比较规则。
2.3 表在文件系统中的表示
2.3.1InnoDB存储引擎模式
1.表结构
为了保存表结构,InnoDB在数据目录下对应的数据库子目录下创建了一个专用于描述表结构的文件,文件名是这样:
表名.frm
2.表中数据和索引
①系统表空间(system tablespace)
默认情况下,InnoDB会在数据目录下创建一个名为ibdata1,大小为12M的文件,这个文件就是对应的系统表空间在文件系统上的表示。该文件是自扩展文件,当不够用时会自己增加文件大小。
也可以让系统表空间对应的文件系统上多个实际文件,或者修改原来的ibata1的名字,此时需要在MySQL启动时配置对应的文件路径以及它们的大小,如作以下修改:
[server]
innodb_data_file_path=data1:512M;data2:512M:autoextend
这样在MySQL启动之后就会创建这两个512M大小的文件作为系统表空间,其中的autoextend表明这两个文件如果不够用会自动扩展data2文件的大小。
需要注意:在一个MySQL服务器中,系统表空间只有一份。从MySQL5.5.7到MySQL5.6.6之间的各个版本中,我们表中的数据都会呗默认存储到这个系统表空间。
②独立表空间(file-per-table tablespace)
在MySQL5.6.6以及之后的版本中,InnoDB并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表述该独立表空间的文件,文件名和表名相同,只不过添加了一个==.ibd==的扩展名而已,完整的文件名称位:
表名.ibd
③系统表空间与独立表空间的设置
我们可以自己指定使用系统表空间还是独立表空间来存储数据,这个给你由参数innodb_file_per_table控制,如下:
[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.00 sec)
innodb_file_per_table的修改只对新建的表起作用,对于已经分配了表空间的表并不起作用。如果想把已经存储在系统表空间中的表专业到独立表空间,可以使用下边的语法:
ALTER TABLE test TABLESPACE innodb_system;
④其他类型的表空间
随着MySQL的发展,除了上述两种老牌表空间之外,现在还新提出一些不同类型的表空间,比如通用表空间(general tablespace)、临时表空间(temporary tablespace)等。
3.疑问
.frm在MySQL8中不存在了
需要解析ibd文件。Orcale官方将frm文件的信息及更多信息移动到叫做序列化字典信息(Serialized Dictionary Information,SDI),SDI被卸载ibd文件内部。MySQL8.0属于Oracle旗下,同理。
为了从IBD文件中提取SDI信息,Oracle提供了一个应用程序ibd2sdi。
这个工具MySQL8自带就有。
(1)查看表结构
到存储ibd文件的目录下,执行下面的命令:
ibd2sdbi --dump-file=student.txt student.ibd
[root@guoyvzhimysql8 mysql]# cd sys
[root@guoyvzhimysql8 sys]# ll
总用量 80
-rw-r-----. 1 mysql mysql 114688 2月 22 14:23 sys_config.ibd
[root@guoyvzhimysql8 sys]# ibd2sdi --dump-file=sys_config.txt sys_config.ibd
[root@guoyvzhimysql8 sys]# ll
总用量 96
-rw-r-----. 1 mysql mysql 114688 2月 22 14:23 sys_config.ibd
-rw-------. 1 root root 13644 2月 23 11:13 sys_config.txt
[root@guoyvzhimysql8 sys]# vim ./sys_config.txt
图中标记分别表示
- 表名
- 列
- 列名
- 列的长度
通过上面的测试结果可以发现,MySQL8把之前版本的frm文件合并到ibd文件中了。
2.3.2 MyISAM存储引擎模式
1.表结构
在存储表结构方面,MyISAM和InnoDB一样,也是在数据目录下对应的数据库子目录下创建了一个专门用于描述表结构的文件:
表名.frm 5.7
表名.sdi 8.0
2.表中数据和索引
在MyISAM中的索引全部都是二级索引,该存储引擎的数据和索引是分开存放的。所以在文件系统中也是使用不同的文件来存储数据文件和索引文件,同时表数据都存放在对应的数据库子目录下。
表名.MYD #存储数据
表名.MYI #存储索引
2.4小结
数据库a,表b。
1、如果b表采用InnoDB,data\a中会产生1个或者2个文件:
- b.frm:描述表结构文件,字段长度等
- 如果采用系统表空间模式的,数据信息和索引信息都存储在ibdata1中
- 如果采用独立表空间存储模式,data\a中还会产生b.ibd文件(存储数信息和索引信息)
此外:
①MySQL5.7中会在data/a的目录下生成db.opt文件用于保存数据库的相关配置。比如:字符集、比较规则。而MySQL8.0不在提供db.opt文件。
②MySQL8.0中不再单独提供b.frm,而是合并在b.ibd文件中。
2.如果表b采用MyISAM。data\a中会产生3个文件: - MySQL5.7中:b.ftm:描述表结构文件,字段长度等。
MySQL8.0中b.xxx.sdi:描述表结构文件,字段长度等。 - b.MYD(MYData):数据信息文件,存储数据信息(如果采用独立表存储结构)
- b.MYI(MYIndex):存放索引信息文件
2.5视图在文件系统的表示
MySQL中的视图其实是虚拟的表,也就是一个查询语句的别名而已,不存储真实的数据,只需把它的结构存储起来就行。和表一样,描述视图的文件也会被存储到所属数据库对应的子目录下标,只会存储一个视图名.frm的文件
2.6其他的文件
除了上边用户自己存储的数据以外,数据目录下还包括为了更好运行程序的一些额外文件,主要包括这几种类型的文件:
- 服务器进程文件
每运行一个MySQL服务器程序,都意味着启动一个进程。MySQL服务器会把自己的进程ID写入到一个文件中。 -
- 服务器日志文件
在服务器运行过程中,会产生各种各样的日志,比如常规的查询日志、错误日志、二进制日志、redo日志等。这些日志各有各的用途。
- 服务器日志文件
- 默认/自动生成的SSL和RSA证书和密钥文件
主要是为了客户端和服务器安全通信而创建的一些文件。