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

本文介绍了如何通过创建并执行MySQL的存储过程来导入frm和ibd文件,从而还原数据库数据。首先,创建一个与原始数据库结构相同的空数据库,然后执行discard_tablespace和import_tablespace两个存储过程,分别丢弃和导入表空间。在停止MySQL服务后,将frm和ibd文件复制到对应目录,最后重新启动MySQL服务完成数据还原。
摘要由CSDN通过智能技术生成

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

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

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

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

ce58ec9026a7eb3f8aca76498cb75a0d.png

还原整个库的数据

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停止

db32e698b56688a755dc98923095c487.png

停止之后,把我们需要导入的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

数据还原成功

mysql导入frm和ibd文件还原数据相关教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值