萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql數據表與記錄誤刪後通過二進制恢復數據

mysql數據表與記錄誤刪後通過二進制恢復數據

數據庫或記錄不小刪除之後只要你的mysql開啟了二進制的話那麼我們就可以通過二進制恢復數據了,具體的操作步驟如下。
mysql誤刪表後恢復數據

 

  等程序運行出錯時,才出現整個表都沒有了,而且之前也沒有備份好!這下蛋疼了,這個可是production服務器,裡面的數據可不能丟啊!

 

  服務器是linux的,我不是很熟悉,也不知道mysql裝在哪。

 

  無奈之下,google,發現有不少人也有像我一樣犯傻的一回,但是幾乎沒有看到具體的解決方法(有說用硬盤軟件找回,也有說用二進制文件找回),但是我本身對服務器不大懂,覺得好糾結,那邊又在催說數據怎麼沒有了,還說一定得找回來。

 

  這下我更急了,晚飯都沒心情吃。

 

  這時,我找到了一些專門幫人恢復數據的技術人員。

 

  他問了我數據量,數據庫引擎,當我說是‘myisam’時,他來了句:那無解了。。

 

  當時我一下子懵了。

 

  情急之下,我想到了,之前在testing服務器裡面有一個副本數據庫,但是那裡的數據已經有些時日了,根本沒有最新一個月的數據。

 

  這根本無法解救我!

 

  這裡我在phpmyadmin中看到了這個:

 

  

 

mysql誤刪表後恢復數據

 

  腦裡出來了google上說的用二進制恢復,就點開看一下。結果大喜!OMG,服務器開通了日志!

 

  

 

mysql誤刪表後恢復數據

 

  裡面有數據庫的操作日志,而且還是sql格式的!!!

 

  我之前沒有接觸過這個東西,但這時它就是我的救命稻草。

 

  我浏覽了一下,裡面有近一個月的更新記錄,已經足夠了。不過有一個問題,在phpmyadmin裡面看,只能顯示其中一小部份內容,面對10幾w的數據行,想要一個個找出被刪表的數據,太難了。

 

  這時,我想到了可以從服務器中下載這些文件,然後得到其中的數據。

 

  說干就干,我登錄服務器,搜索這些二進制文件:

 

  

 

mysql誤刪表後恢復數據

 

  上圖中紅圈的就是了

 

  然後將這些文件一個個導出成可以閱讀的sql:

 

  

 

mysql誤刪表後恢復數據

 

  這樣將這些二進制文件一個個輸出成了正常的sql文件。

 

  這時,就是要從這些文件中找到被刪表相關的數據了,於是我寫了個java程序幫我做這個事情:

 

  package com.nerve.sql.reload;

 

  import java.io.BufferedReader;

 

  import java.io.BufferedWriter;

 

  import java.io.FileReader;

 

  import java.io.FileWriter;

 

  import java.util.ArrayList;

 

  import java.util.List;

 

  import org.nerve.util.NumberUtil;

 

  /**

 

  * @project: cloudOffice_swing

 

  * @file: ReloadWorker.java

 

  * @package: com.nerve.sql.reload

 

  * @description:

 

  * 將二進制日志導出的文件中相應表的操作記錄提出出來

 

  * @author: 集成顯卡 [email protected]

 

  * @date&time: Jan 23, 2014

 

  * @change log:

 

  */

 

  public class ReloadWorker {

 

  public void read(List orgF, String targetF, String table) throws Exception{

 

  BufferedWriter bw = new BufferedWriter(new FileWriter(targetF, true));

 

  for(String or:orgF){

 

  BufferedReader br = new BufferedReader(new FileReader(or));

 

  String t = null;

 

  String t2 = null;

 

  table = table.toUpperCase();

 

  while((t=br.readLine())!=null){

 

  t2 = t.toUpperCase();

 

  /*

 

  * 如果是update操作,直接提出

 

  */

 

  if(t2.startsWith("UPDATE "+table)){

 

  bw.append(t+";\n");

 

  }

 

  /*

 

  * 如果是insert語句,因為有一些舊服務器的數據

 

  * 所以要先執行delete操作

 

  */

 

  else if(t2.startsWith("INSERT INTO "+table)){

 

  String ids = t2.substring(t2.lastIndexOf(","));

 

  bw.append("delete from "+table+" where id="+NumberUtil.toDigital(ids)+";\n");

 

  bw.append(t+";\n");

 

  }

 

  /*

 

  * sql語句後面都要加 ; ,因為原來沒有,不加的話,在導入到數據庫時,出錯

 

  */

 

  }

 

  br.close();

 

  }

 

  bw.flush();

 

  bw.close();

 

  }

 

  public static void main(String[] args) throws Exception{

 

  long sd = System.currentTimeMillis();

 

  ReloadWorker w = new ReloadWorker();

 

  List orgs = new ArrayList();

 

  orgs.add("C:/Users/IBM_ADMIN/Desktop/000015.txt");

 

  orgs.add("C:/Users/IBM_ADMIN/Desktop/000016.txt");

 

  orgs.add("C:/Users/IBM_ADMIN/Desktop/000017.txt");

 

  orgs.add("C:/Users/IBM_ADMIN/Desktop/000018.txt");

 

  orgs.add("C:/Users/IBM_ADMIN/Desktop/000019.txt");

 

  String targetS = "C:/Users/IBM_ADMIN/Desktop/000017_sql.txt";

 

  w.read(orgs, targetS, "task");

 

  System.out.println("DONE, on " +(System.currentTimeMillis() - sd)/1000+" s");

 

  }

 

  }

 

  得到了匯總的sql文件後,就導入到數據庫中。

 

  最後,出一個運行圖:

 

  

 

mysql誤刪表後恢復數據

 

  終於松了一口氣。(雖然這次導入花了5分鐘。。)
copyright © 萬盛學電腦網 all rights reserved