目录

2638264600 的个人博客

记录精彩的程序人生

Mysq Innerdb引擎下的 .frm .ibd文件还原表结构、表数据

解决方案如下:

1)因不知道原表结构,特地安装了mysql-utilities 实用工具,在其根目录下执行命令:

mysqlfrm --server=root:123@localhost:3306 xxxx.frm --port=3309 --user=root > ‘xxxx’.sql

localhost:3306为『mysql用户名:密码@数据库地址:端口』,xxxx.frm是你要恢复的表,port=3309表示端口,注意如果你原数据库端口是3306,那这里就随便写一个其他未被占用的端口,这个端口不能跟原数据库端口相同,user=root表示以root用户运行,否则可能无权限读取你的xxxx.frm数据,‘xxxx’.sql是读取你frm接口后输出的sql语句。

mysqlfrm用法详情见:https://blog.csdn.net/anzhen0429/article/details/78007341

2、根据xxxx.sql里的语句见表,这样表结构就还原了

3、解除innerdb表与.ibd文件的绑定

ALTER TABLE xxxx DISCARD TABLESPACE;

xxxx为操作的表名
 

4、net stop mysql;//关闭mysql服务

5、将你之前的.ibd文件拷贝到相应数据下

6、net start mysql;//启动服务

7、绑定新的.ibd文件

ALTER TABLE xxxx IMPORT TABLESPACE;


方案二

  1. 在一个可以正常使用的MySQL数据库中建立一个库

create database back;

  1. 在库中创建一个与要恢复表的同名表(字段数量与要恢复的表数量相同,否则后面步骤3中会出错,如果不知道有多少个字段可以在下一步出错时在错误信息中找到)

create table test1( id1 int, id2 int, id3 int );

  1. 关闭数据库服务,然后用需要恢复的test1.frm覆盖这个新建的back数据库的test1.frm,接着对配置文件(my.ini)设置innodb_force_recovery = 6,然后使用启动数据库服务

    desc test1;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | NO | PRI | NULL | |
    | name | varchar(10) | YES | | NULL | |
    | age | int(11) | YES | | NULL | |
    +-------+-------------+------+-----+---------+-------+

  2. 查看并复制创建表的SQL语句

5.关闭数据库服务,接着对配置文件中的innodb_force_recovery = 6删除或者注释,然后使用启动数据库服务

6.删除test1表,再用复制出来的建表语句重建test1表

7.将原.ibd文件与原.frm文件解除绑定

alter table test1 discard tablespace;

8.停掉数据库服务,将需要恢复的test1.ibd文件覆盖这个新建的back数据库的test1.ibd,开启数据库服务。

  1. 将复制过来的test1.ibd文件与test1.frm文件关联

alter table test1 import tablespace;

恢复完成!


标题:Mysq Innerdb引擎下的 .frm .ibd文件还原表结构、表数据
作者:三学一心
地址:http://bk.isseeker.com/articles/2019/08/31/1567189768603.html