MySQL使用frm文件和ibd文件恢复数据的方法(实战)

概要

本教程模拟数据库突然宕机,重启失败,而且没有binlog的前提下通过MySQL中的frm文件和ibd文件恢复表中的数据,MySQL版本5.7.26

准备数据
  1. 创建数据库,test01
CREATE DATABASE test01 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
  1. 创建数据,在数据库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数据
  1. 根据数据库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读不出来表中设置的默认值

  1. 新建一个与数据库一样的环境

创建数据库

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 中

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值