MySQL文件管理

数据库文件

MySQL的每个数据库都对应存放在一个与数据库同名的文件夹中,这些文件包括MySQL所建数据库文件和,MySQL所用存储引擎创建的数据库文件

MySQL创建并管理的文件

.fmt文件:存储数据表的框架结构,文件名与表名相同,与操作系统和存储引擎无关

MySQL所用的存储引擎创建的数据库文件

(在MySQL版本<8.0时).frm文件是必要的

根据MySQL所使用的存储引擎的不同,存储引擎会创建各自不同的数据库文件(MySQL常用的两个存储引擎是MyISAM和InnoDB)

MyISAM

.MYD文件:即My Data,表数据文件

.MYI文件:即My Index,索引文件

.sdi文件:是一个json文件,记录描述了表空间中包含的表和表空间对象

InnoDB

InnoDB采用表空间来管理数据,存储表数据和索引

ibdata[x]:系统表文件,存储InnoDB系统信息和用户数据库表数据和索引,所有表共用

.ibd文件:单表表空间文件,每个表使用一个表空间文件,存放用户数据库表数据和索引

ib_logfile[x]:日志文件

表空间

MySQL总共有六种表空间:系统表空间(也叫共享表空间)、独立表空间、临时表空间、undo表空间、通用表空间、传输表空间

系统表空间

在上图System Tablespace处,在文件中的体现是ibdata文件,在初始化mysql实例的时候就会生成,可能有ibdata1,ibdata2...,当系统表空间不够用时,它会自动扩展,扩展不是重新生成一个文件ibdata2,而是在ibdata1的基础上扩容

系统表空间不能在线进行更改,只能在配置文件(my.cnf)中修改参数后,重启mysql实例

独立表空间

在上图File-Per-Table Tablespace处,即一个表一个文件,将表数据分开存放后,损坏一个文件不至于影响所有表;容易维护,查询速度快

恢复MyISAM引擎驱动的表

MySQL版本<8.0时

只要有.frm.MYD.MYI文件存在,直接复制到MySQL的数据目录中,MySQL就可以读取到这张表了

MySQL版本>=8.0时

指定MySQL的安全目录secure_file_priv

然后能在MySQL中

show variables like 'secure_file_priv'

即可

然后将所要恢复的表的.sdi文件拷贝的secure_file_priv指定的目录下,新建一个空数据库testdb,建好数据库后,MySQL数据库目录下会出现testdb文件夹,将所有要恢复的表的.MYD.MYI文件拷贝到这个目录中

最后在MySQL中执行

import table from '[secure_file_priv指向的目录]/*.sdi'

就可以恢复表了