目 录CONTENT

文章目录

MySQL的数据目录

FatFish1
2025-04-30 / 0 评论 / 0 点赞 / 23 阅读 / 0 字 / 正在检测是否收录...

MySQL数据目录结构

MySQL数据目录的结构

InnoDB、MyISAM都是硬盘存储的,数据实际在文件系统上,这与服务宕机重启后,数据不受影响

使用如下命令可以确定数据目录:

SHOW VARIABLES LIKE 'datadir'

一般默认的目录是/usr/local/var/mysql/

进入这个目录,可以看到其目录下面与数据库名对应的文件夹

---mysql
---performance_schema
---sys
---myDb
---auto.cnf
---ca-key.pem
……

唯独找不到information_schema这个库,因为这个库比较特殊,MySQL不使用相应的数据库目录

表在文件系统中的表示

表结构定义存储方式

表可以大致分成两部分:表的结构定义、表中的数据

在数据库的对应目录下可以找到以.frm结尾的文件,存储的就是表的机构定义,其中是二进制文件,无法直接打开

该文件一般与表名一致,但有时还有一些编码出现,这是因为表名中存在一些非数字或拉丁字母,都会转成@+编码形式

InnoDB的表数据存储方式

InnoDB的数据实际存储在表空间文件中,在MySQL5.6.6之前,只有系统表空间,即全部表数据都存储在一个文件中,这个文件叫ibdata1

这个文件初始大小是12M,后续不够用可以自行扩展

如果觉得这个文件太大,想做分文件处理,可以使用如下系统变量:

[server]
innodb_data_file_path=data1:512M;data2:512M:autoextend

这样在 MySQL 启动之后就会创建这两个512M大小的文件作为系统表空间 ,其中的 autoextend 表明这两个文件 如果不够用会自动扩展 data2 文件的大小

而如果连目录位置都想调整一下,不让他生成在默认的路径/usr/local/var/mysql/testdb 中,则可以调整innodb_data_home_dir系统变量

在MySQL5.6.6之后,InnoDB不再把所有数据存储在系统表空间,而是为每个表建立单独的表空间,例如testdb库中的test1表和test2表就有如下:

--- /usr/local/var/mysql/testdb
------ test1.frm
------ test1.ibd
------ test2.frm
------ test2.ibd

可以看到,独立表空间比系统表空间多了一个.ibd后缀,其他都差不多

同时新版的MySQL也可以自行配置决定将数据存储在系统表空间还是独立表空间,使用如下配置项:

[server]
innodb_file_per_table=0  # 为0,代表使用系统表空间,为1,代表使用独立表空间

已经创建的表也支持修改其表空间,可以使用如下语句:

# 把已存在系统表空间中的表转移到独立空间
ALTER TABLE 表名 TABLESPACE innodb_file_per_table;

# 已经存在独立表空间的表转移到系统表空间
ALTER TABLE test TABLESPACE innodb_system;

MyISAM的表数据存储方式

MyISAM没有表空间,所有的数据都是存放在子目录下,例如

--- /usr/local/var/mysql/testdb
------ test1.frm
------ test1.MYD
------ test1.MYI

其中MYD是数据文件,MYI是索引文件

视图在文件系统中的表示

视图其实是虚拟的表,只是某个查询语句的一个别名,因此视图只需要存储结构,不需要存储数据,因此在对应数据库的目录下面只会生成一个.frm文件,文件以视图名命名

其他文件

其他文件包括服务器进程文件(记录MySQL服务器的进程ID)、服务器日志文件(查询日志、二进制日志、redo日志等等)、默认/自动生成的SSL和RSA证书和密钥文件

MySQL系统库简介

  • mysql:存储MySQL的用户账户和权限信息,一些存储过程、事件定义信息、运行日志等

  • information_schema:维护数据库的信息,包括表、视图、触发器、索引、列字段信息等,也是元数据表

  • performance_schema:存储运行过程中的状态信息、性能监控、执行时长、语句历史、内存状况等

  • sys:通过视图形式把information_schema和performance_schema结合起来

0

评论区