Linux中Mysql使用.ibd文件恢复/备份数据

192 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

之前在数据库操作的时候误操作把数据库直接删除了,也没有备份SQL,差点跑路,最后发现数据库的ibd文件还存在,算是不幸中的万幸,经过一顿操作最终是把数据恢复了。

在此记录一下恢复过程,也提醒大家在数据库操作的时候一定要记得备份!一定要记得备份!一定要记得备份!重要的话讲三遍

这个是后面在一个测试库上演示的恢复过程,该数据库版本为8.0.17

1.首先创建一个表保证与原始表结构一致

这个表结构如果也没了的话,查看数据库的data目录下.frm文件是否存在,如果这个文件存在的话也可以通过这个文件恢复表结构,具体恢复步骤自行百度,如果这个也没了,建议跑路

注:在5.5.26版本需要将ROW_FORMAT = Dynamic改为ROW_FORMAT = compact,在8.0.17版本中不需要修改为ROW_FORMAT = compact

2.删除新建的表空间: ALTER TABLE 表名 DISCARD TABLESPACE;

ALTER TABLE auth_biz_sys DISCARD TABLESPACE;

B97C707A-6F29-4C47-BBD6-E6C8C285B52A.png

3.复制待恢复的<table_name>.ibd文件到目标数据库文件夹下面并修改权限:(此处以表auth_biz_sys为例)

cp ../alice1/auth_biz_sys.ibd .

chown mysql:mysql auth_biz_sys.ibd

4.导入表空间<table_name>.ibd: ALTER TABLE <table_name> IMPORT TABLESPACE;

ALTER TABLE auth_biz_sys import TABLESPACE;

FEA2D5AD-4AB2-4E88-8E05-404058E052E2.png

然后查看数据库表数据,发现恢复成功

image.png

这个是单张表我们这么操作,如果表过多的话一个一个操作太过繁琐,也比较费时费力,因此我们需要找一种简单的方式去批量执行,如下

批量删除表空间

SELECT concat('alter table ', table_name, 'DISCARD TABLESPACE;') FROM information_schema.tables WHERE table_schema = 'alice';

批量授权

chown -R mysql:mysql *

批量导入表空间

SELECT concat('alter table ', table_name, 'import TABLESPACE;') FROM information_schema.tables WHERE table_schema = 'alice';

注:alice为库名

执行完上述操作后即可恢复