1 背景
公司某个业务系统的MySQL貌似被黑死活启动不了,气急之下决定重置数据库。业务数据库名称dzjf,库表位于/var/lib/mysql/dzjf目录,备份的时候仅仅备份了次目录下的所有文件,很不幸手头居然没有所有表的SQL脚本。
2 步骤
2.1 恢复表结构
首先重新创建一个数据库dzjf:
CREATE DATABASE dzjf;
USE dzjf;
接着创建一张表,表的名字要和你要恢复的表名一致,这里我要恢复user表。但是我不知道原先user表里的字段名称和字段类型了,怎么办?没关系,用UltraEdit打开备份出来的user.frm文件,在文件的最后你可以看到都有哪些字段,
当然还是看不出字段类型,但这已经足够了,我们只要知道接有几个字段就行,字段类型可以忽略,接下来要创建的user表只要字段数量能够对应上就可以,字段类型随意。
CREATE TABLE user(id1 INT, id2 INT, id3 INT, id4 INT, id5 INT, id6 INT, id7 INT, id8 INT, id9 INT, id10 INT, id11 INT, id12 INT, id13 INT, id14 INT, id15 INT);
创建好后,我们退出mysql,同时停止mysql的服务
systemctl stop mysql.service
然后将之前备份的user.frm文件复制到/var/lib/mysql/dzjf目录下覆盖掉刚创建的user.frm。然后重新启动mysql。
systemctl start mysql.service
重新进入mysql控制台,执行以下命令:
USE dzjf;
DESC user;
此时我们可以看到奇迹发生了,user表的结构恢复出来了,
赶紧把user表的DDL导出来吧,
SHOW CREATE TABLE user\G
那表结构都恢复了,那我们就可以使用user表了吗?答案是:NO。我们需要把这个表删除,然后用导出的建表SQL重新建表,这个时候的表才是真正能使用的。
2.2 恢复表数据
恢复表数据需要首先将新建的user.ibd文件与user.frm文件解除绑定,具体就是在控制台执行下面命令:
ALTER TABLE user DISCARD TABLESPACE;
接着退出控制台,停止mysql服务,然后将前面备份的user.ibd文件覆盖这个新建的user.ibd文件,再重新开启mysql服务。最后将user.ibd文件与user.frm文件重新关联。具体执行下面命令:
ALTER TABLE user IMPORT TABLESPACE;
这时候查看user表,就会发现数据已经成功恢复啦!