资源简介

这是我从网上找到的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


评论

共有 条评论