解决 linux系统因误删ibdata1文件,导致MySQL Innodb数据库无法启动(恢复流程)
一、引言
因本人服务器物理迁移,而在迁移过程中没有把ibdata1共享表空间文件做备份。。。(下次一定要记得删除操作前要备份!!),部分数据文件损坏,此恢复操作必须基于frm和idb文件没有受损的情况下尽可能的恢复数据,当然,mysql服务也必须能正常启动后,所以需要手动恢复数据,此篇文章记录一下通过dbsake,依据mysql的 .frm 文件和 .ibd 文件恢复数据库接口 + 数据。一定要把数据库的frm文件和ibd文件第一时间建立备份,然后再执行后面的恢复操作,因为这是数据恢复最后的希望,如果再丢失,那就回天乏力了;
二、安装dbsake
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 文件 恢复表结构
./dbsake frmdump /var/lib/mysql/test/*.frm >> /root/recover/test.sql
注: ./dbsake 代表我dbsake我安装到了此目录下
/var/lib/mysql/ 这个是my.conf 里面配置的datadir test 是数据库
/root/recover/ 这个存放是恢复生成的建表语句
1. 创建一个空的数据库 test2
2. 执行上面恢复的 .sql 文件,创建新的表
3. 释放表空间(discard),因为执行建表语句,mysql 的 datadir(my.conf中指定)下面会自动生成新的 .frm 文件和 .ibd 文件,所以要删除默认生成的 .ibd 文件,这个文件就是存放数据的文件,恢复数据依靠它;
SELECT concat('alter table ', table_name, ' discard tablespace;') FROM information_schema.tables WHERE table_schema = 'test';
以上sql会生成批量的释放表空间的sql,拷贝出来执行,以此释放表空间
例如: alter table user discard tablespace; 执行完之后,datadir文件下的 user.ibd文件就被删除了。
安全起见,每个表执行单独一次如下sql命令
alter table table_name discard tablespace;
四、依据 .ibd 文件 恢复表数据
1. 把备份文件下面的 .ibd 文件 拷贝到 新创建的数据库文件下面,并且授权对应的权限都是 mysql chown -R mysql:mysql 新的文件
[root@db01 world]# cp *.ibd /data/mysql/xxx_com/
[root@db01 world]# chown -R mysql. /data/
2. 重新加载表空间(import)
SELECT concat('alter table ', table_name, ' import tablespace;') FROM information_schema.tables WHERE table_schema = 'test';
以上sql会生成批量的加载表空间的sql,拷贝出来执行,以此加载表空间
例如:alter table user import tablespace; 执行完之后刷新数据库,就可以看到备份数据了。
最后刷新数据库:flush privileges;
mysql的配置文件
innodb_force_recovery=1这个配置用完了记得改为0或者删除了,否则也会有问题。
至此,ibdata1文件已经完全恢复,MySQL Innodb数据库里面的各个数据表都可以正常打开了。