资源简介
这是我从网上找到的mysql/mariadb对innodb表进行数据恢复的工具,实现从innodb的数据库文件中恢复数据,用于实现下面情况:1、直接下载了innodb数据库的文件,而不是导出其数据,想恢复数据时(需要有完整的文件,比如你必须对mysql数据文件目录完整下载) 2、innodb的数据库崩溃,没有做备份,需要恢复拯救数据时
工具是有效的,我已经验证过,不过不能保证100%恢复,有部分表可能操作不成功,但,可以试试啦~~
代码片段和文件信息
using System;
using System.Threading;
using System.Net;
using System.Collections;
using System.Collections.Specialized;
using System.Collections.Generic;
using System.Security;
using System.Diagnostics;
using System.Security.Permissions;
using System.Text;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text.Regularexpressions;
using MySql.Data.MySqlClient;
class a{
static void Main(string[] args){
Console.WriteLine(“MySql InnoDB Restore tool by zcgonvh.\r\n“);
if(args.Length!=5){Console.WriteLine(“usage: InnoDBRestore “);return;}
string dbname=args[4];
try{
MySqlConnection conn=new MySqlConnection(string.Format(“Host=localhost;UserName={0};Password={1};Port={2};“args[0]args[1]args[2]));
conn.Open();
MySqlCommand cmd=conn.CreateCommand();
cmd.CommandTimeout=0x200000;
cmd.CommandText=“SET GLOBAL innodb_file_format=‘Barracuda‘;“;//innodb-compressed row_format
cmd.ExecuteNonQuery();
cmd.CommandText=“set global innodb_file_per_table=‘on‘;“;//single innodb
cmd.ExecuteNonQuery();
cmd.CommandText=“set names utf8;“;
cmd.ExecuteNonQuery();
cmd.CommandText=“create database “+dbname;
cmd.ExecuteNonQuery();
cmd.CommandText=“select @@datadir“;
string datadir=cmd.ExecuteScalar()+“\\“+dbname+“\\“;
string filedir=args[3];
conn.ChangeDatabase(dbname);
foreach(FileInfo frm in new DirectoryInfo(filedir).GetFiles(“*.frm“))
{
Console.WriteLine(“restoring : “+frm);
string tablename=frm.Name.Substring(0frm.Name.Length-4);
//modify frm set type=memory
try{
byte[] b=File.ReadAllBytes(frm.FullName);
if(b[0]!=0xfe || b[1]!=0x01) //table magic fe 01
{
Console.WriteLine(“not a table frm“);
continue;
}
if(b[3]!=0x0c) //table type innodb
{
if(b[3]==0x09)
{
Console.WriteLine(“this is a MyISAM db copy it.“);
frm.CopyTo(datadir+frm.Nametrue);
File.Copy(filedir+tablename+“.MYD“datadir+tablename+“.MYD“);
File.Copy(filedir+tablename+“.MYI“datadir+tablename+“.MYI“);
}
else
{
Console.WriteLine(“unknown table type“);
}
continue;
}
uint offset=BitConverter.ToUInt16(b6);//io_size
offset+=BitConverter.ToUInt16(b0x0e);//tmp_key_length
offset+=BitConverter.ToUInt16(b0x10);//rec_length
offset+=2;//00 00
uint len=BitConverter.ToUInt16(b(int)offset);//type string lengthin word
offset+=2;
if(Encoding.Default.GetString(b(int)offset(int)len)!=“InnoDB“)
{
Console.WriteLine(“not an innodb frm“);
continue;
}
b[3]=6;//_DB_TYPE_HEAP
Array.Copy(new byte[]{0x4d0x450x4d0x4f0x520x59}0boffset6);//MEMORY
FileInfo ibd=new FileInfo(frm.FullName.Substring(0frm.FullName.Length-3)+“ibd“);
if(!ibd.Exists)
{
Console.WriteLine(“can not found ibd: “+ibd);
continue;
}
File.WriteAllBytes(datadir+frm.Nameb);//write to frm file
cmd.CommandText=“flush table
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4653 2015-07-08 17:01 mysql恢复数据工具\mysqlibd\InnoDBRestore.cs
文件 8192 2015-07-08 17:01 mysql恢复数据工具\mysqlibd\InnoDBRestore.exe
文件 2934 2015-07-09 17:55 mysql恢复数据工具\mysqlibd\mysql innodb还原工具.txt
文件 455168 2015-02-25 03:34 mysql恢复数据工具\mysqlibd\MySql.Data.dll
文件 3125 2015-07-08 16:53 mysql恢复数据工具\mysqlibd\MySqlFrm.cs
文件 6656 2015-07-08 16:53 mysql恢复数据工具\mysqlibd\MySqlFrm.exe
目录 0 2018-07-30 17:00 mysql恢复数据工具\mysqlibd
目录 0 2018-07-30 17:00 mysql恢复数据工具
----------- --------- ---------- ----- ----
480728 8
- 上一篇:易语言Mysql线程池2.0模块源码
- 下一篇:mysql5.7驱动.rar
评论
共有 条评论