找到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
数据还原成功