本文已参与「新人创作礼」活动,一起开启掘金创作之路。
之前在数据库操作的时候误操作把数据库直接删除了,也没有备份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;
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;
然后查看数据库表数据,发现恢复成功
这个是单张表我们这么操作,如果表过多的话一个一个操作太过繁琐,也比较费时费力,因此我们需要找一种简单的方式去批量执行,如下
批量删除表空间
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为库名
执行完上述操作后即可恢复