概要
本教程模拟数据库突然宕机,重启失败,而且没有binlog的前提下通过MySQL中的frm文件和ibd文件恢复表中的数据,MySQL版本5.7.26
准备数据
- 创建数据库,test01
CREATE DATABASE test01 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
- 创建数据,在数据库test01创建测试数据表
t
,并插入100000条测试数据
use test01;
CREATE TABLE `t` (
`id` int(11) NOT NULL,
`c` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
delimiter ;;
create procedure idata()
begin
declare i int;
set i=1;
while(i<=100000) do
insert into t values(i,i);
set i=i+1;
end while;
end;;
delimiter ;
call idata();
恢复表t数据
- 根据数据库test01中表t生成的t.frm文件获取t的表结构
mysqlfrm --diagnostic t.frm
CREATE TABLE `t` (
`id` int(11) NOT NULL,
`c` int(11) DEFAULT NULL,
PRIMARY KEY `PRIMARY` (`id`)
) ENGINE=InnoDB;
注意mysqlfrm读不出来表中设置的默认值
- 新建一个与数据库一样的环境
创建数据库
CREATE DATABASE test01 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
根据读出的表结构创建表
use test01;
CREATE TABLE `t` (
`id` int(11) NOT NULL,
`c` int(11) DEFAULT NULL,
PRIMARY KEY `PRIMARY` (`id`)
) ENGINE=InnoDB;
删除t的表空间
alter table t discard tablespace;
将原表的t.ibd文件复制到新环境之下,设置好权限,然后执行
alter table t import tablespace;
恢复数据完成
可以简单检查一下数据行
select count(*) from t;
注意事项
如果数据库突然宕机,有可能ibd中的数据并不全,根据WAL机制,可能会有一部分数据在undo log 中