innodb通过frm ibd还原数据,线上项目验证过

终极篇,先说下前提:

线上项目服务器机器故障重启了,导致mysqld服务启动后,show tables;能看到所有表,但是查询表数据提示表不存在:

[SQL]select * from tb_name;
[Err] 1146 - Table 'eluosi_repair9.tb_name' doesn't exist

网上看了好多帖子都不管用,可能我的情况跟他们的不一样,也不知道他们试没试过。搞了两天终于搞好了~

还原过程,如果有疑问请给我留言,共同进步:

以下为恢复俄罗斯数据为例,内网机器为192.168.1.11
1.tar 打包外网出问题的data文件,并sz到本地桌面
tar -zcvf server_0001.tar.gz /data/mysql/3306/data/server_0001
tar -zcvf ibdata1.tar.gz /data/mysql/3306/ibdata1

2.在内网(192.168.1.11)搭建与外网的mysql同样的版本,并暂停内网mysqld服务(最好在192.168.1.11上搞,因为覆盖文件 ibdata1 会影响别的测试服数据库)
3.修改 my.cnf 添加一行 innodb_force_recovery=6
4.把桌面压缩包文件 (server_0001.tar.gz ibdata1.tar.gz 等) rz -y 到内网数据库路径(/data/mysql/3306/data)然后解压
tar -zxvf server_0001.tar.gz
tar -zxvf ibdata1.tar.gz

5.修改权限 chown -R mysql.mysql /data/mysql/3306/data/*

6.启动内网mysqld 并通过日志查看数据恢复状况(vim /data/mysql/3306/logs/error.log)
7.此时的数据已经恢复,但是不能读写,需要重新dump出来,切记不要在navicate上操作,一定要在centos上操作。
语句:mysqldump -uroot --skip-opt --add-drop-table --create-options -f -q -e --hex-blob --routines --single-transaction -B server_0001 -p -h127.0.0.1> ~/server_0001.sql
8.暂停外网mysqld服务,备份好data,然后清掉(用rm -rf 方式,因为此时mysqld没启动)
9.启动外网mysqld服务,先用建库脚本createMarDB.sh。然后将导出的语句导入到外网库(只需要导入server_0001.sql,不需要ibdata1文件,因为它的作用就是为了dump出sql数据)
语句:mysql -h192.168.1.11 -uroot -p123456 < server_0001.sql
10.大功告成,起服走你~ (最后,记得还原内网192.168.1.11 my.cnf的配置innodb_force_recovery = 0)

posted @ 2020-04-27 17:42  菜鸡徐思  阅读(2332)  评论(0编辑  收藏  举报