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结合起来
评论区