MySql InnoDb还原工具
通过任意文件下载找到了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环境,命令行如下:
InnoDBRepair <username> <password> <port> <srcdir> <destDB>
例如:
InnoDBRepair root pass 3306 c:\dbcopy my_database
会将c:\dbcopy目录下所有的innodb和myiasm表还原到本地mysql的my_database数据库中,mysql必须是5.6或更高版本才能成功还原。
其源码为InnoDBRestore.cs,编译命令行:
csc /r:mysql.data.dll InnoDBRestore.cs
务必使用.net 4.0进行编译。
MySqlFrm.exe是c#版本的frm转sql工具,需要.net 4.0与mysql环境,命令行如下:
mysqlfrm <username> <password> <port> <srcdir>
例如:
mysqlfrm root pass 3306 c:\dbcopy
会将c:\dbcopy目录下所有的frm转换为同名的建表sql并保存在frm文件所在目录(需要借助本地mysql进行转换)。
其源码为mysqlfrm.cs,编译命令行:
csc /r:mysql.data.dll mysqlfrm.cs
同样务必使用.net 4.0进行编译。
关于工具的利用:
在任意文件下载中可以尝试直接下载mysql的数据文件进行还原;mysql注入时可以load_file读取frm来偷懒,确定表并不是很大的时候(例如管理员表)甚至可以直接读取文件之后恢复。
脱裤的时候可以不管表类型直接打包了,比mysqldump快得多。innodb表压缩率在20%左右,打包下来并不会很大。
还原崩溃的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还原工具的更多相关文章
- (4.8)mysql备份还原——binlog查看工具之show binlog的使用
(4.8)mysql备份还原——binlog查看工具之mysqlbinlog及show binlog的使用 关键词:show binlog,mysql binlog查看,二进制文件查看,binlog查 ...
- mysql多线程备份与还原工具mydumper
(一)mydumper介绍 之前我们已经学过如何使用mysqldump备份恢复数据库:<mysql逻辑备份与还原工具mysqldump>,就目前来说,mysqldump是使用最广泛的MyS ...
- MySQL InnoDB Update和Crash Recovery流程
MySQL InnoDB Update和Crash Recovery流程 概要信息 首先介绍了Redo,Undo,Log Sequence Number (LSN),Checkpoint,Rollba ...
- (4.3)mysql备份还原——mysql备份策略
(4.3)mysql备份还原——mysql备份策略 1.指定备份策略时需要考虑的点 [1.1]备份周期:2次备份间隔时长 [1.2]备份方式:在备份周期中,使用什么备份方式.备份模式 [1.3]实现方 ...
- mysql命令行工具
mysql包相关命令行工具 [root@manage ~]# rpm -qa|grep mysql mysql-server-5.1.73-5.el6_7.1.x86_64 mysql-5.1.73- ...
- mysql监控管理工具--innotop
https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/innotop/innotop-1.9. ...
- MySQL 闪回工具之 binlog2sql
生产上误删数据.误改数据的现象也是时常发生的现象,作为 DBA 这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太 ...
- (4.11)mysql备份还原——mysql闪回技术(基于binlog)
0.闪回技术与工具简介 mysql闪回工具比较流行三大类: [0.1]官方的mysqlbinlog:支持数据库在线/离线,用脚本处理binlog的输出,转化成对应SQL再执行.通用性不好,对正则.se ...
- (4.5)mysql备份还原——深入解析二进制日志(1)binlog的3种工作模式与配置
(4.5)mysql备份还原——深入解析二进制日志(binlog) 关键词:二进制日志,binlog日志 0.建议 (1)不建议随便去修改binlog格式(数据库级别) (2)binlog日志的清理 ...
随机推荐
- Django之使用celery异步完成发送验证码
使用celery的目的:将项目中耗时的操作放入一个新的进程实现 1.安装celery pip install celery 2.在项目的文件夹下创建包celery_tasks用于保存celery异步任 ...
- Linux文本检索命令grep笔记
grep是在linux系统中基于行文本非常实用检索工具,通过该命令可以将匹配到的结果信息输出到终端控制台. 语法格式:grep [-ivnc] '需要匹配的内容' 文件名 常用参数说明: -i 检索的 ...
- windows操作笔记
使用服务或其他windows应用的过程中,可能会遇到莫名其妙的错误,这时候从控制面板中,找到管理工具,打开事件查看器,或者通过计算机管理,找到日志中的记录,如果是代码错误,会给出提示信息,比如之前在写 ...
- ES6(对象扩展)
ES6(对象(object)新增特性) 1.简介表示法 o,k 为属性:这种为无方法的情况. 这种为有方法. 2.属性表达式 ES6中,[a]就是 b . 3.新增API 1.数组也是引用类型 2.O ...
- Selenium加载Chrome/Firefox浏览器配置文件
Selenium启动浏览器时,默认是打开一个新用户,不会加载原有的配置以及插件.但有些时候我们可能需要加载默认配置. 一.Chrome浏览器 1.在Chrome浏览器的地址栏输入:chrome://v ...
- URAL 1277 Cops and Thieves
Cops and Thieves Time Limit: 1000ms Memory Limit: 16384KB This problem will be judged on Ural. Origi ...
- 图的最小生成树——Prim算法
Prim算法 Prim算法求最小生成树是采取蓝白点的思想,白点代表已经加入最小生成树的点,蓝点表示未加入最小生成树的点. 进行n次循环,每次循环把一个蓝点变为白点,该蓝点应该是与白点相连的最小边权的是 ...
- codeforces 315B
#include<stdio.h> int main() { int n,k,i,flag=0; while(scanf("%d%d",&n,&k)!= ...
- 内存管理——(exceptional C++ 条款9,条款10)
C++的各个内存区域: (1)常量数据(const data)区 常量数据区存储的是字符串等在编译期间就能确定的值,在整个程序的生命周期内,这里的数据都是可用.区域内所有的数据都是 只读的. (2)栈 ...
- WKWebView的了解
1. http://blog.csdn.net/chenyong05314/article/details/53735215 2. http://www.jianshu.com/p/6ba250744 ...