資源簡介
這是我從網上找到的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
評論
共有 條評論