使用ibd文件恢复innodb数据

mysql常用引擎有两种,myisam和innodb。myisam备份容易,直接备份.frm,.MYD,.MYI文件,然后再复制粘贴到目标数据库文件夹即可。但是innodb则不可以,即使你把.frm,.ibd文件放到目标数据库文件夹,也不是查看该数据表。那么,能否使用.ibd文件恢复innodb数据表呢?

以下则是使用ibd文件恢复数据的方法:
注:使用ibd文件恢复数据的前提是,需要恢复的表的结构和表名你是需要知道的。

1. 安装mysql环境

使用phpStudy安装新的php和mysql环境。(此处用phpStudy是因为搭建环境快捷,且可以一个系统可装多个mysql环境)

2. 设置mysql配置文件

设置mysql配置文件,my.ini
设置错误日志 log-err=”D:/phpStudy/MySQL/data/error.err”
设置innodb独立空间 innodb-file-per-table=1
使用ibd文件恢复innodb数据_第1张图片
重启mysql服务

3. 建立同名同结构数据表

在新的mysql中建立数据库,建立数据表,该数据表应与需恢复的数据表结构和表名一致。
如我的ibd文件为:members.ibd
而我创建的数据表为:members
另:该表无需有数据

4. 分离表结构和数据

分离数据表的数据和结构:ALTER TABLE members DISCARD TABLESPACE;
此时我们会看到该数据表的ibd文件消失了。
未分离时:
使用ibd文件恢复innodb数据_第2张图片
分离后:
使用ibd文件恢复innodb数据_第3张图片

5.表数据与表结构建立联系

把要恢复的ibd文件复制到新的数据表文件夹中,然后使用:ALTER TABLE members IMPORT TABLESPACE;来建立关系。 此时有可能会报错,报错内容为:

[SQL]ALTER TABLE members IMPORT TABLESPACE;
[Err] 1030 - Got error -1 from storage engine

此时需要查看mysql错误日志,发现:

InnoDB: how you can resolve the problem.
170728 11:10:23
InnoDB: Error: tablespace id and flags in file ‘.\blueshop3\members.ibd’ are 4 and 0, but in the InnoDB
InnoDB: data dictionary they are 3 and 0.

错误表示两个表的tablespace id不一致。旧数据表的tablespace id为4,但目前的数据表的tablespace id为3。那么接下来要做的是使tablespace id一致。

6. 比较tablespace id,使得tablespace id一致

如果新的表的tablespace id 小于待恢复表的tablespace id,则可以通过创建表来增加tablespace id,最后在待恢复表的tablespace id处再创建一次members表,再分离表结构和表数据,把待恢复的ibd文件复制到新的表文件夹中,再把结构和数据建立关系,如果此时没报错,则关系已建立完成。
批量生成数据表可使用php脚本来完成:


    $dsn = "mysql:host=localhost;port=3306;charset=utf8;dbname=blueshop";
    $user = 'root';
    $password = 'root';
    $pdo = new PDO($dsn,$user,$password);

    $sql = "";
    for($i=1;$i<12;$i++){
        $sql .= "create table i{$i}(id int)engine innodb;";
    }
    $pdo->exec($sql);
?>

如果新的表的tablespace id 大于待恢复表的tablespace id,则有两种方案,第一,重建一个mysql服务,则tablespace id就会从1开始,则必定小于待恢复表的tablespace id。第二,找到待恢复表的tablespace id所对应的那个表,然后把这个表改成与待恢复表的结构和表名。

7. 备份数据

关系建立完成,但还是不能查询数据,此时需要更改mysql配置文件, 添加或修改:innodb_force_recovery=5,不行则1-6都尝试一遍。待数据可查询时,立即备份即可。

你可能感兴趣的:(php,mysql)