一、引言
公司因服务器物理迁移,导致mysql宕机,无法再次重启,所以需要手动恢复数据,此篇文章记录一下通过dbsake,依据mysql的 .frm 文件和 .ibd 文件恢复数据库接口 + 数据。
二、安装dbsake
curl -s get dbsake.net > dbsake
chmod u+x dbsake
注:如果没有配置环境变量的话,那就是哪里执行的此命令,默认安装到当下,别处用需要指定安装路劲
三、依据 .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文件就被删除了。
四、依据 .ibd 文件 恢复表数据
1. 把备份文件下面的 .ibd 文件 拷贝到 新创建的数据库文件下面,并且授权
对应的权限都是 mysql chown -R mysql:mysql 新的文件
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; 执行完之后刷新数据库,就可以看到备份数据了。