mysql导入frm和ibd文件还原数据

 

找到mysql安装目录下data目录所在地址

通过:show global variables like "%datadir%";找到地址

还原整个库的数据

1:创建一个新的数据库,数据库需要和frm和ibd的数据库表名和表结构必须一模一样

所以可以导入之前的数据库,我们只为了还原数据而已

导入原来的数据库结构之后,我们先创建以下mysql的存储过程

注意,里面需要改对应的数据库名称  mydataSo的位置

-- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除
DROP PROCEDURE
IF
	EXISTS discard_tablespace;-- 创建存储过程
CREATE PROCEDURE discard_tablespace () BEGIN-- 定义变量
	DECLARE
		s INT DEFAULT 0;
	DECLARE
		tableName VARCHAR ( 255 );-- 定义游标,并将sql结果集赋值到游标中
	DECLARE
		report CURSOR FOR SELECT
		table_name 
	FROM
		information_schema.TABLES 
	WHERE
		table_schema = 'mydataSo' -- mydataSo是创建的那个数据库名称
		AND table_type = 'base table';-- 声明当游标遍历完后将标志变量置成某个值
	DECLARE
		CONTINUE HANDLER FOR NOT FOUND 
		SET s = 1;-- 打开游标
	OPEN report;-- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和sql结果列的顺序一致
	FETCH report INTO tableName;-- 当s不等于1,也就是未遍历完时,会一直循环
	WHILE
			s <> 1 DO-- 执行业务逻辑
			
			SET @tableName = CONCAT( tableName );
		
		SET @sqlStr = CONCAT( CONCAT( 'alter table ', @tableName ), ' discard tablespace' );
		PREPARE stmt 
		FROM
			@sqlStr;
		EXECUTE stmt;
		DEALLOCATE PREPARE stmt;-- 将游标中的值再赋值给变量,供下次循环使用
		FETCH report INTO tableName;-- 当s等于1时表明遍历以完成,退出循环
		
	END WHILE;-- 关闭游标
	CLOSE report;
	
END;
-- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除
DROP PROCEDURE
IF
	EXISTS import_tablespace;-- 创建存储过程
CREATE PROCEDURE import_tablespace () BEGIN-- 定义变量
	DECLARE
		s INT DEFAULT 0;
	DECLARE
		tableName VARCHAR ( 255 );-- 定义游标,并将sql结果集赋值到游标中
	DECLARE
		report CURSOR FOR SELECT
		table_name 
	FROM
		information_schema.TABLES 
	WHERE
		table_schema = 'mydataSo'  -- mydataSo是创建的那个数据库名称
		AND table_type = 'base table';-- 声明当游标遍历完后将标志变量置成某个值
	DECLARE
		CONTINUE HANDLER FOR NOT FOUND 
		SET s = 1;-- 打开游标
	OPEN report;-- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和sql结果列的顺序一致
	FETCH report INTO tableName;-- 当s不等于1,也就是未遍历完时,会一直循环
	WHILE
			s <> 1 DO-- 执行业务逻辑
			
			SET @tableName = CONCAT( tableName );
		
		SET @sqlStr = CONCAT( CONCAT( 'alter table ', @tableName ), ' IMPORT tablespace' );
		PREPARE stmt 
		FROM
			@sqlStr;
		EXECUTE stmt;
		DEALLOCATE PREPARE stmt;-- 将游标中的值再赋值给变量,供下次循环使用
		FETCH report INTO tableName;-- 当s等于1时表明遍历以完成,退出循环
		
	END WHILE;-- 关闭游标
	CLOSE report;
	
END;

创建成功之后,执行CALL discard_tablespace ();

执行完之后,data目录下新建产生的数据库目录里的ibd将会全部被删除,这一步也是为了我们导入ibd和frm的必要过程

执行成功之后,将mysql停止

停止之后,把我们需要导入的frm和ibd文件复制到data目录下新建产生的数据库目录里,(注意不要导入db.opt)提示需要覆盖的文件覆盖即可。

然后打开任务管理器再启动mysql

启动成功之后,执行CALL import_tablespace ();

到这一步即可将frm和ibd文件里的数据还原出来了。

还原某一张表的数据

和前面一样的步骤

1:创建一个新的数据库,该数据库里面创建需要还原数据的表,表名和表结构必须和frm和ibd的数据表一致

2:执行alter table tableName discard tablespace  tableName是需要还原数据的表名

3:任务管理器关闭mysql服务

4:复制frm和ibd的数据到data目录下新建产生的数据库目录里

5:启动mysql服务

6:执行alter table tableName IMPORT tablespace

数据还原成功

 

 

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值