通过任意文件下载找到了mysql的备份,表类型是独享式innodb,由一个frm文件和一个ibd文件组成。

本以为直接复制到本地的mysql数据目录中即可恢复数据,但在查询时却发现并不如所愿:

mysql> select * from admin;
ERROR 1146 (42S02): Table 'test.admin' doesn't exist
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| admin          |
+----------------+
1 row in set (0.00 sec)

查找资料得知,innodb的表信息存放于datadir下面的ib_logfile*与ibdata1文件内。而由于事务的存在,这些文件在复制后并不能还原。

由于独享式innodb的数据实际上都保存在ibd文件内,于是尝试直接从ibd文件内恢复数据。最后在stackexchange(http://dba.stackexchange.com/questions/57120/recover-mysql-database-from-data-folder-without-ibdata1-from-ibd-files )找到了老外的一个思路:

1.使用mysqlfrm工具将frm转换为建表语句
2.创建空表
3.释放表空间
4.复制ibd文件,还原表空间

http://dev.mysql.com/downloads/utilities/ 下载了mysqlfrm工具,执行时发现速度非常慢,同时不支持2003。于是下载其源码,发现其原理大致如下:

1.修改frm头部标志位为_DB_TYPE_HEAP,表示内存表
2.修改frm文件中保存的表引擎名称为MEMORY
3.复制文件到数据目录,执行show create table还原sql
4.替换语句中的MEMORY为原始引擎

对照以上原理,修改成了速度很快的c#版本。

使用工具进行测试,可以成功的还原数据,但操作非常麻烦,为了便捷操作最后写了这个工具批量恢复。

本地使用了十余个表进行了测试,总数据条数大概五百万条,没有出现任何问题。

附件内InnoDBRestore.exe是编译好的恢复工具,需要.net 4.0与mysql 5.6环境,命令行如下:

Bash
InnoDBRepair <username> <password> <port> <srcdir> <destDB>

例如:

Bash
InnoDBRepair root pass 3306 c:\dbcopy my_database

会将c:\dbcopy目录下所有的innodb和myiasm表还原到本地mysql的my_database数据库中,mysql必须是5.6或更高版本才能成功还原。

其源码为InnoDBRestore.cs,编译命令行:

Bash
csc /r:mysql.data.dll InnoDBRestore.cs

务必使用.net 4.0进行编译。

MySqlFrm.exe是c#版本的frm转sql工具,需要.net 4.0与mysql环境,命令行如下:

Bash
mysqlfrm <username> <password> <port> <srcdir>

例如:

Bash
mysqlfrm root pass 3306 c:\dbcopy

会将c:\dbcopy目录下所有的frm转换为同名的建表sql并保存在frm文件所在目录(需要借助本地mysql进行转换)。

其源码为mysqlfrm.cs,编译命令行:

Bash
csc /r:mysql.data.dll mysqlfrm.cs

同样务必使用.net 4.0进行编译。

关于工具的利用:

  1. 在任意文件下载中可以尝试直接下载mysql的数据文件进行还原;mysql注入时可以load_file读取frm来偷懒,确定表并不是很大的时候(例如管理员表)甚至可以直接读取文件之后恢复。

  2. 脱裤的时候可以不管表类型直接打包了,比mysqldump快得多。innodb表压缩率在20%左右,打包下来并不会很大。

  3. 还原崩溃的mysql数据。

已知错误信息:

ERROR 1030 (HY000): Got error -1 from storage engine

换用高版本的mysql进行恢复,推荐使用5.6.24版本。

若出现此错误信息,务必手动删除@@datadir下刚刚指定的目标数据库,否则mysql服务停止后将无法启动。

(不一定有用但可能解决大问题的工具,留着备用吧)

下载地址:        mysqlibd.zip

百度网盘:http://pan.baidu.com/s/1c0rrLfE

解压密码见注释。

MySql InnoDb还原工具的更多相关文章

  1. (4.8)mysql备份还原——binlog查看工具之show binlog的使用

    (4.8)mysql备份还原——binlog查看工具之mysqlbinlog及show binlog的使用 关键词:show binlog,mysql binlog查看,二进制文件查看,binlog查 ...

  2. mysql多线程备份与还原工具mydumper

    (一)mydumper介绍 之前我们已经学过如何使用mysqldump备份恢复数据库:<mysql逻辑备份与还原工具mysqldump>,就目前来说,mysqldump是使用最广泛的MyS ...

  3. MySQL InnoDB Update和Crash Recovery流程

    MySQL InnoDB Update和Crash Recovery流程 概要信息 首先介绍了Redo,Undo,Log Sequence Number (LSN),Checkpoint,Rollba ...

  4. (4.3)mysql备份还原——mysql备份策略

    (4.3)mysql备份还原——mysql备份策略 1.指定备份策略时需要考虑的点 [1.1]备份周期:2次备份间隔时长 [1.2]备份方式:在备份周期中,使用什么备份方式.备份模式 [1.3]实现方 ...

  5. mysql命令行工具

    mysql包相关命令行工具 [root@manage ~]# rpm -qa|grep mysql mysql-server-5.1.73-5.el6_7.1.x86_64 mysql-5.1.73- ...

  6. mysql监控管理工具--innotop

    https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/innotop/innotop-1.9. ...

  7. MySQL 闪回工具之 binlog2sql

    生产上误删数据.误改数据的现象也是时常发生的现象,作为 DBA 这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太 ...

  8. (4.11)mysql备份还原——mysql闪回技术(基于binlog)

    0.闪回技术与工具简介 mysql闪回工具比较流行三大类: [0.1]官方的mysqlbinlog:支持数据库在线/离线,用脚本处理binlog的输出,转化成对应SQL再执行.通用性不好,对正则.se ...

  9. (4.5)mysql备份还原——深入解析二进制日志(1)binlog的3种工作模式与配置

    (4.5)mysql备份还原——深入解析二进制日志(binlog) 关键词:二进制日志,binlog日志 0.建议 (1)不建议随便去修改binlog格式(数据库级别) (2)binlog日志的清理 ...

随机推荐

  1. bzoj2588 counting on a tree

    题目不难,树上可持久化数据结构. 帖代码: #include<cstdio> #include<algorithm> using namespace std; #define ...

  2. Django:调用css、image、js

    1.在项目的manage.py同级目录创建static.templates 2.编辑settings.py,在最后加入 STATIC_URL = '/static/' HERE = os.path.d ...

  3. struts2接受请求参数

    https://blog.csdn.net/y249839817/article/details/77702745 https://blog.csdn.net/nthack5730/article/d ...

  4. zoj 1240

    IBM Minus One Time Limit: 2 Seconds      Memory Limit: 65536 KB You may have heard of the book '2001 ...

  5. Java SSH框架系列:用户登录模块的设计与实现思路

    1.简介用户登录模块,指的是根据用户输入的用户名和密码,对用户的身份进行验证等.如果用户没有登录,用户就无法访问其他的一些jsp页面,甚至是action都不能访问.二.简单设计及实现本程序是基于Jav ...

  6. Bzoj 2726 SDOI 任务安排

      Memory Limit: 131072KB   64bit IO Format: %lld & %llu Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务 ...

  7. 【HDOJ6305】RMQ Similar Sequence(笛卡尔树)

    题意: 给定一个数组a,现在存在一个数组b,其元素值在[0,1]随机生成 若对于a,b,任意rmq问题的最值出现在同一个数组中的位置,则数组b的价值为∑b[i],否则为0,求数组b的期望价值 n< ...

  8. 【NOIP模拟&POJ2152】灰色的果实(树形DP)

    题意: Nebula 历 2014 年 12 月 17 日,欢迎来到异世界. 面对截然不同的新世界,你决定采取最普通但最为有效的方式来探索,那便 是徒步.准备好营地的一切,你开始了探索的旅程. 步行大 ...

  9. ListView更新问题

    ListView和Adapter对象均具备有对象更新方法 ListView对象列表的更新方法1.invalidate();--重绘组件2.invlidateView()--重绘组件并包含所有的View ...

  10. hdu6215 Brute Force Sorting(模拟)

    题意 给一个长度为n(n<=1e5)的序列,如果一个位置i满足a[i-1]>a[i]或者a[i]>a[i+1],那么我们就称该位置是不合法的位置 先把序列中所有不合法的位置统一找出来 ...