程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> phpmyadmin誤刪表後的恢復過程,phpmyadmin誤刪

phpmyadmin誤刪表後的恢復過程,phpmyadmin誤刪

編輯:MySQL綜合教程

phpmyadmin誤刪表後的恢復過程,phpmyadmin誤刪


話說今天不知道是抽風了還是失魂了,在用phpmyadmin刪除測試數據時,竟然將整個表刪除了:

等程序運行出錯時,才出現整個表都沒有了,而且之前也沒有備份好!這下蛋疼了,這個可是production服務器,裡面的數據可不能丟啊!   服務器是linux的,我不是很熟悉,也不知道mysql裝在哪。 無奈之下,google,發現有不少人也有像我一樣犯傻的一回,但是幾乎沒有看到具體的解決方法(有說用硬盤軟件找回,也有說用二進制文件找回),但是我本身對服務器不大懂,覺得好糾結,那邊又在催說數據怎麼沒有了,還說一定得找回來。 這下我更急了,晚飯都沒心情吃。   這時,我找到了一些專門幫人恢復數據的技術人員。 他問了我數據量,數據庫引擎,當我說是‘myisam’時,他來了句:那無解了。。 當時我一下子懵了。   情急之下,我想到了,之前在testing服務器裡面有一個副本數據庫,但是那裡的數據已經有些時日了,根本沒有最新一個月的數據。 這根本無法解救我!   這裡我在phpmyadmin中看到了這個:   腦裡出來了google上說的用二進制恢復,就點開看一下。結果大喜!OMG,服務器開通了日志! 裡面有數據庫的操作日志,而且還是sql格式的!!! 我之前沒有接觸過這個東西,但這時它就是我的救命稻草。 我浏覽了一下,裡面有近一個月的更新記錄,已經足夠了。不過有一個問題,在phpmyadmin裡面看,只能顯示其中一小部份內容,面對10幾w的數據行,想要一個個找出被刪表的數據,太難了。   這時,我想到了可以從服務器中下載這些文件,然後得到其中的數據。 說干就干,我登錄服務器,搜索這些二進制文件: 上圖中紅圈的就是了   然後將這些文件一個個導出成可以閱讀的sql: 這樣將這些二進制文件一個個輸出成了正常的sql文件。   這時,就是要從這些文件中找到被刪表相關的數據了,於是我寫了個java程序幫我做這個事情: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 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<String> 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<String> orgs = new ArrayList<String>();         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文件後,就導入到數據庫中。 最後,出一個運行圖:   終於松了一口氣。(雖然這次導入花了5分鐘。。)   最後提醒大家,一定要常備份,謹慎操作啊!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved