本次数据库灾难目前原因由于猜测是由于短时间内大量数据写入导致的数据库异常关闭,部分数据文件损坏,此恢复操作必须基于frm和idb文件没有受损的情况下尽可能的恢复数据,当然,mysql服务也必须能正常启动后,如果还无法正常启动mysql服务,请先转到mysql服务重启频道;
第一步:
一定要把数据库的frm文件和ibd文件第一时间建立备份,然后再执行后面的恢复操作,因为这是数据恢复最后的希望,如果再丢失,那就回天乏力了;
第二步:
再创建一个数据库(数据库配置尽量保持一致,编码设置等…),然后将之前之前挂掉的数据库的表及结构恢复到这个新建的数据库中,如果有表结构备份sql直接运行,如果没有备份sql那就需要用到之前我们提到的frm文件,据我理解,frm文件保存的是表结构信息(包括字段,键及索引),idb文件才是保存的具体数据(表空间),所以这两个文件缺一不可,frm文件不支持直接读取,所以我们需要借助工具
https://download.csdn.net/download/qq_40986512/34799416
这个是windows版本,直接将frm文件读取成sql,然后直接运行,但是这个windows版本不能读取出视图的frm文件(视图的sql也是一个frm文件,但是视图没有idb文件),但是视图的frm文件可以用notepad++直接读取;
linux的frm读取工具(可以直接读取所有frm,包括视图的)
安装命令:
curl -s http://get.dbsake.net > dbsake
chmod u+x dbsake
./dbsake --version
安装路径/dbsake frmdump frm文件路径/***.frm
这一步必须要做的,而且要保证表结构要保持跟之前挂掉的必须是一模一样的,用工具的原因就是为了保证表结构一致,如果不一致会导致后面的操作步骤出现问题或者数据乱码
第三步
调整innodb的参数
修改/etc/my.cnf文件,增加一个强制恢复相关的参数:
innodb_force_recovery=1 //此参数网上搜了一下大体意思好像是暴力恢复级别,有0-6个级别
第四步
现在新建的表也会生成新的frm和ibd文件了,frm文件如果是读取的之前数据库的frm文件那一般情况下表结构应该就是一致的了,但是ibd文件肯定是空的,然后让现在的这些新的空表的
表结构和表空间脱离
执行sql
alter table 要恢复的表名 discard tablespace;
这个sql会删除表明对应的.ibd文件
第五步
文件拷贝和赋予权限
将之前备份的挂掉的数据库的.ibd文件拷贝到这个新的数据库目录下(其实意思就是将.ibd文件替换成原来的)
拷贝完成后要将文件的访问权限修改成mysql,这里要## 注意,(赋权命令是在linux执行,可不是SQL)
chown -R mysql.mysql 对应表名的.ibd
mysql只认权限为mysql的ibd文件和frm文件,就算改成777,mysql也是不认的!!
导入表空间(即恢复数据)
执行SQL(在linux还是navicat自行选择)
alter table 要恢复的表名 import tablespace
然后打开表查看是表内数据是否恢复
在执行import tablespace的时候如果发生了报错问题报错信息为Lost connection xxxxxx,有以下几点原因
1:数据表结构不正确,再自己看看sql是否在复制的时候出现了问题;
2:尝试把建表语句中的索引语句删除后再执行建表,因为mysql会把每一个索引保存在mysql的系统表innodb_index_status表中,如果系统表没有恢复可能会发生报错;
以上方法仅仅一个表一个表的恢复,比较费事费力
批量恢复
1.批量脱离表空间sql
SELECT concat('alter table ', table_name, ' discard tablespace;')
FROM information_schema.tables
WHERE table_schema = '新建的数据库的名字';
2.批量拷贝.ibd文件到新数据库下
3.批量导入表空间
SELECT concat('alter table ', table_name, ' import tablespace;')
FROM information_schema.tables
WHERE table_schema = '新建的数据库的名字';
批量赋mysql文件权限
chown -R mysql.mysql *
最后
mysql的配置文件
innodb_force_recovery=1这个配置用完了记得改为0或者删除了,否则也会有问题。
这样恢复以后查看一下mysql的日志,可能会有报错的问题,基本也是因为系统表丢失的原因,感觉可以重装mysql,然后将恢复的数据直接迁移到最新的mysql中去
最后的最后,最方便快速的恢复方法还是备份数据库,赋sqlDump的恢复脚本一个,自行定义定时任务
保留7天备份,基本够用了
感谢此次灾后重建工作的重要技术支持CSDN博主「奔跑吧人生」的原创文章。
原文链接:https://blog.csdn.net/ywg_1994/article/details/102692017