由于未关闭mysql服务就将服务器重启,导致服务器无法重启,使用fsck修复磁盘后启动服务器后,发现mysql数据文件损坏和丢失,但还存在idb文件。

数据库版本:5.7.20

什么是idb文件

如何通过idb文件恢复数据

mysql 5.7.20 目前使用的是独立表空间,每一个表都存在独立的ibd文件和frm文件,如下:

Shell

[root@db01 /data/mysql/oldboy]# ll

total 69648

-rw-r----- 1 mysql mysql 61 Mar 8 11:57 db.opt

-rw-r----- 1 mysql mysql 8780 Mar 8 17:50 t1.frm

-rw-r----- 1 mysql mysql 71303168 Mar 8 17:50 t1.ibd

1

2

3

4

5

[root@db01/data/mysql/oldboy]# ll

total69648

-rw-r-----1mysqlmysql61Mar811:57db.opt

-rw-r-----1mysqlmysql8780Mar817:50t1.frm

-rw-r-----1mysqlmysql71303168Mar817:50t1.ibd

准备另外一台服务器用于还原数据,这里采用不同实例来恢复

STEP 1 获取并创建表结构,如果表结构都不知道的话,可以去寻找开发寻求帮助提供表结构语句

MySQL

xad-[oldboy]>show create table t1\G

*************************** 1. row ***************************

Table: t1

Create Table: CREATE TABLE `t1` (

`stuid` int(11) NOT NULL,

`stuname` varchar(20) NOT NULL,

`stusex` char(1) NOT NULL,

`cardid` varchar(20) NOT NULL,

`birthday` datetime DEFAULT NULL,

`entertime` datetime DEFAULT NULL,

`address` varchar(100) DEFAULT NULL,

PRIMARY KEY (`stuid`),

KEY `idx_name` (`stuname`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

xad-[oldboy]>showcreatetablet1\G

***************************1.row***************************

Table:t1

CreateTable:CREATETABLE`t1`(

`stuid`int(11)NOT NULL,

`stuname`varchar(20)NOT NULL,

`stusex`char(1)NOT NULL,

`cardid`varchar(20)NOT NULL,

`birthday`datetimeDEFAULTNULL,

`entertime`datetimeDEFAULTNULL,

`address`varchar(100)DEFAULTNULL,

PRIMARY KEY(`stuid`),

KEY`idx_name`(`stuname`)

)ENGINE=InnoDBDEFAULTCHARSET=utf8

1rowinset(0.00sec)

STEP 2 在另一台实例上创建库后并运行上面的的建表语句

MySQL

xad-[(none)]>create database ibdtest;

Query OK, 1 row affected (0.00 sec)

xad-[(none)]>use ibdtest;

Database changed

xad-[ibdtest]>CREATE TABLE `t1` (

-> `stuid` int(11) NOT NULL,

-> `stuname` varchar(20) NOT NULL,

-> `stusex` char(1) NOT NULL,

-> `cardid` varchar(20) NOT NULL,

-> `birthday` datetime DEFAULT NULL,

-> `entertime` datetime DEFAULT NULL,

-> `address` varchar(100) DEFAULT NULL,

-> PRIMARY KEY (`stuid`),

-> KEY `idx_name` (`stuname`)

-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Query OK, 0 rows affected (0.02 sec)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

xad-[(none)]>createdatabaseibdtest;

QueryOK,1rowaffected(0.00sec)

xad-[(none)]>useibdtest;

Databasechanged

xad-[ibdtest]>CREATETABLE`t1`(

->`stuid`int(11)NOT NULL,

->`stuname`varchar(20)NOT NULL,

->`stusex`char(1)NOT NULL,

->`cardid`varchar(20)NOT NULL,

->`birthday`datetimeDEFAULTNULL,

->`entertime`datetimeDEFAULTNULL,

->`address`varchar(100)DEFAULTNULL,

->PRIMARY KEY(`stuid`),

->KEY`idx_name`(`stuname`)

->)ENGINE=InnoDBDEFAULTCHARSET=utf8;

QueryOK,0rowsaffected(0.02sec)

查看此时数据库目录,会生成一个ibdtest库名的目录,目录文件如下

Shell

[root@db01 /data/3307/data]# ll ibdtest/

total 128

-rw-r----- 1 mysql mysql 65 Mar 9 14:15 db.opt

-rw-r----- 1 mysql mysql 8780 Mar 9 14:15 t1.frm

-rw-r----- 1 mysql mysql 114688 Mar 9 14:15 t1.ibd

1

2

3

4

5

[root@db01/data/3307/data]# ll ibdtest/

total128

-rw-r-----1mysqlmysql65Mar914:15db.opt

-rw-r-----1mysqlmysql8780Mar914:15t1.frm

-rw-r-----1mysqlmysql114688Mar914:15t1.ibd

STEP 3 测试将上面目录中的t1.ibd文件直接换为源库中的ibd文件,替换后注意文件权限和属主属组的修改,测试是否能直接恢复数据

Shell

[root@db01 /data/3307/data]# cp /data/mysql/oldboy/t1.ibd ./ibdtest/

cp: overwrite ‘./ibdtest/t1.ibd’? y

[root@db01 /data/3307/data]# ll ibdtest/

total 131024

-rw-r----- 1 mysql mysql 65 Mar 9 14:15 db.opt

-rw-r----- 1 mysql mysql 8780 Mar 9 14:15 t1.frm

-rw-r----- 1 mysql mysql 71303168 Mar 9 14:22 t1.ibd

1

2

3

4

5

6

7

[root@db01/data/3307/data]# cp /data/mysql/oldboy/t1.ibd ./ibdtest/

cp:overwrite‘./ibdtest/t1.ibd’?y

[root@db01/data/3307/data]# ll ibdtest/

total131024

-rw-r-----1mysqlmysql65Mar914:15db.opt

-rw-r-----1mysqlmysql8780Mar914:15t1.frm

-rw-r-----1mysqlmysql71303168Mar914:22t1.ibd

此时是依然看不见原来的数据的

MySQL

xad-[ibdtest]>select count(*) from t1;

+----------+

| count(*) |

+----------+

| 0 |

+----------+

1 row in set (0.00 sec)

1

2

3

4

5

6

7

xad-[ibdtest]>select count(*)fromt1;

+----------+

|count(*)|

+----------+

|0|

+----------+

1rowinset(0.00sec)

STEP 4 得先清空表的tablespace后再导入源表的ibd文件

MySQL

xad-[ibdtest]>alter table t1 discard tablespace;

Query OK, 0 rows affected (0.02 sec)

[root@db01 /data/3307/data]# cp /data/mysql/oldboy/t1.ibd ./ibdtest/

[root@db01 /data/3307/data]# chown -R mysql.mysql ./*

[root@db01 /data/3307/data]# ll ibdtest/

total 69648

-rw-r----- 1 mysql mysql 65 Mar 9 14:15 db.opt

-rw-r----- 1 mysql mysql 8780 Mar 9 14:15 t1.frm

-rw-r----- 1 mysql mysql 71303168 Mar 9 14:26 t1.ibd

xad-[ibdtest]>alter table t1 import tablespace;

Query OK, 0 rows affected, 1 warning (0.29 sec)

xad-[ibdtest]>select count(*) from t1;

+----------+

| count(*) |

+----------+

| 500000 |

+----------+

1 row in set (0.33 sec)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

xad-[ibdtest]>altertablet1discardtablespace;

QueryOK,0rowsaffected(0.02sec)

[root@db01/data/3307/data]# cp /data/mysql/oldboy/t1.ibd ./ibdtest/

[root@db01/data/3307/data]# chown -R mysql.mysql  ./*

[root@db01/data/3307/data]# ll ibdtest/

total69648

-rw-r----- 1 mysql mysql       65 Mar  9 14:15 db.opt

-rw-r----- 1 mysql mysql     8780 Mar  9 14:15 t1.frm

-rw-r----- 1 mysql mysql 71303168 Mar  9 14:26 t1.ibd

xad-[ibdtest]>altertablet1importtablespace;

QueryOK,0rowsaffected,1warning(0.29sec)

xad-[ibdtest]>select count(*)fromt1;

+----------+

|count(*)|

+----------+

|500000|

+----------+

1rowinset(0.33sec)

STEP 5 此时再将表数据导出,之后再导回原库中来恢复数据

xadocker, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权

转载请注明原文链接:Mysql 通过ibd文件恢复数据

mysql ibd文件还原_Mysql 通过ibd文件恢复数据相关推荐

  1. mysql ibd文件还原_MySQL单表ibd文件恢复方法详解

    前言: 随着innodb的普及,innobackup也成为了主流备份方式.物理备份对于新建slave,全库恢复的需求都能从容应对. 但当面临单表数据误删,或者单表误drop的情况,如果使用物理全备进行 ...

  2. mysql日志文件名字_MySQL各类日志文件相关变量介绍

    文章转自:http://www.ywnds.com/?p=3721 查询所有日志的变量 1 mysql>show global variables like'%log%'; GLOBAL表示查全 ...

  3. mysql官网下载后解压是文件夹_mysql解压文件安装

    一直以来都习惯了使用MySQL安装文件(.exe),今天下载了一个.zip版本的MySQL,安装过程中遇到了一些问题,如下: 1.在MySQL官网上(http://dev.mysql.com/down ...

  4. mysql 导入sql命令_MySQL导入.sql文件及常用命令

    MySQL导入.sql文件及常用命令 在MySQL Qurey   Brower中直接导入*.sql脚本,是不能一次执行多条sql命令的,在mysql中执行sql文件的命令: mysql> so ...

  5. mysql数据库咋还原_mysql数据库备份和还原

    一.数据备份 1.使用mysqldump命令备份 mysqldump命令将数据库中的数据备份成一个文本文件.表的结构和表中的数据将存储在生成的文本文件中. mysqldump命令的工作原理很简单.它先 ...

  6. mysql异机还原_MySQL innobackupex全量备份恢复

    转自 http://blog.itpub.net/27099995/viewspace-1295099/ 先简单介绍一下这个工具:innobackupex innobackupex比xtarbacku ...

  7. 如何根据一个.raw文件还原为一个dicom文件

    本文由Markdown语法编辑器编辑完成. 1. 需求背景 已知已经获取到了一幅dicom医学图像的像素文件, 它的格式为.raw文件. 由于市面上通用的dicom viewer软件, 都只能识别di ...

  8. mysql dump还原_mysql dump备份和恢复

    --------------------------------------------- 1.准备工作 --------------------------------------------- - ...

  9. mysql表误删回复_mysql 找回误删表的数据方法(必看)

    有备份的话很简单,只需要生成一个最近备份的数据 然后用mysqlbinlog找回备份时间点之后的数据 再恢复到现网即可. 要是没有备份 可能就会比较麻烦,找回数据的成本也是非常之高的. 下面介绍下 m ...

最新文章

  1. python列表用法详解(查找、添加、删除、修改、复制、循环遍历、列表嵌套)
  2. 华为荣耀9x怎么解账户锁_麒麟820,4000万像素,荣耀X10是下一部千元街机?
  3. 计算机网络「二」—— 物理层(多图详解)
  4. 几行代码,轻松带你实现Java生成二维码功能!
  5. 靠一杯茶融资160亿
  6. 好程序员大数据教学点睛:Hadoop基础篇
  7. MATLAB music分解信号,MUSIC算法信号频率问题求解
  8. 网上银行储存管理系统总结报告
  9. AI中的图像识别技术的原理及过程
  10. 超市仓库商品盘点作业流程,仓库如何进行盘点,仓库盘点流程?仓库盘点好方法?
  11. 网件RAX70 SWRT固件和刷机/救砖教程
  12. WinCap数据包显示
  13. 微信分享自定义图标大小限制_微信分享时安卓的自定义参数无效的解决办法
  14. 【ROSE】1. Rational Rose简介
  15. 2022-2028年全球与中国热电堆和微测辐射热计红外探测器行业发展趋势及投资战略分析
  16. BUUCTF 每天10道Misc Day4
  17. 2884: 水果分级
  18. python替换文本
  19. 开运算和闭运算的异同
  20. Linux系统中errno对应的中文意思 errno.h

热门文章

  1. DNS解析过程详解【转】
  2. AC日记——欧几里得的游戏 洛谷 P1290
  3. 第一个Servlet和Jsp
  4. 命令行运行hadoop实例wordcount程序
  5. 做事范围是多么多么重要
  6. 【转】深入研究java.lang.Class类
  7. 实施和开发哪个前景好_web前端与java后台开发哪个前景、待遇好?
  8. html导出excel时换行符,ASP.NET 导出到Excel时保留换行的代码
  9. 牛批了,1行python代码就可实现炫酷可视化
  10. 那个计算机应用没有广告,为什么别人的电脑没有什么广告,而你的电脑一大堆呢?答案在这里...