当数据库无法启动时,我们可以通过数据库的data目录恢复数据
MYSQL8.0已经取消了frm文件,恢复数据的前提是你需要知道表结构
首先在data目录找到对应的文件(show variables like 'datadir';可以显示data位置)
QQ截图20231225123207.png
然后我们需要在其他电脑上安装一个和原来版本相同的mysql,并配置远程登录,
恢复数据分为两步,先通过frm文件恢复表结构,然后使用ibd文件恢复数据

frm恢复

恢复表结构时我们需要使用mysqlfrm 工具

wget https://cdn.mysql.com/archives/mysql-utilities/mysql-utilities-1.6.5.tar.gz
tar -xvf mysql-utilities-1.6.5.tar.gz
cd mysql-utilities-1.6.5/
#安装(需要Python环境,python2.6及以上)
python ./setup.py build
python ./setup.py install
#检查是否安装成功
mysqlfrm --version

恢复之前我们需要在数据库中建立一个对应的数据库,比如你要恢复的数据库是test,那就建立一个test数据库,并且字符集需要一致,字符集可以在数据目录的db.opt文件看到
然后我们通过这个工具连接刚刚新安装的数据库并解析frm文件

mysqlfrm --server=root:[email protected]:3306  /root/temp/test/*.frm --diagnostic > test.sql

/root/temp/test/.frm是frm文件的路径,使用.frm解析目录下的所有frm文件,得到test.sql;我们编辑这个文件,将文件头部的说明删除,然后执行这个sql文件你就会看到原来的表结构恢复了,但是没有数据
QQ截图20231225125735.png

ibd恢复

前边我们已经将表结构恢复好了,但是数据为空
接下来恢复表数据。我们先使用命令行登录数据库
恢复表数据时需要每张表单独操作
然后执行命令

ALTER TABLE 数据库名.表名 DISCARD TABLESPACE;

执行此命令之后数据库会删除当前库的ibd数据文件,然后我们把带数据的ibd文件复制到当前数据库的目录,并设置好文件权限(权限和目录下的frm文件保持一致即可),再执行命令让数据库加载ibd文件

ALTER TABLE 数据库名.表名 DISCARD TABLESPACE;

ALTER TABLE 数据库名.表名 IMPORT TABLESPACE; SHOW WARNINGS;

如果没用error(可能有WARNINGS不用管)就代表这张表恢复成功了,此时我们查看该表就可以看到数据了

到此,整个库的恢复已经完成