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分钟。。)

最后提醒大家,一定要常备份,谨慎操作啊!

时间: 2024-11-05 16:35:48

phpmyadmin误删表后的恢复过程的相关文章

phpmyadmin误删表后如何恢复

用mysqlbinlog php处理代码: 将mysql-bin.xxxxxx文件导出为可读文本: <?php //导出mysql-bin.000xxx文件为可读性txt文本 //0为执行成功,1为失败 //system("cd D:/wamp/bin/mysql/mysql5.5.8/data",$comReturn); for ($i=200;$i<267;$i++){ $command = "D:/wamp/bin/mysql/mysql5.5.8/bin/

linux 7.2误删glibc后的恢复

今天要在一台测试服务器上装Oracle,用yum安装依赖包老是提示glibc版本冲突,原来已经安装的版本比较高,于是手欠直接rpm -e 把glibc和glibc-common给删除了,然后运维直接来找我说服务器登录不上去了,然后我这边也一直在报错: -bash: /usr/bin/ls: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory 不管执行什么操作都是报上面的错误,心想这下完蛋了,是不是

己亥清爽恢复系列之数据文件4篇:DROP表后如何恢复(非闪回技术)

己亥清爽系列说明:清爽系列是作为恢复系列的基础篇,基于FS(File System)文件系统的手工还原恢复,也叫基于用户管理的还原恢复,来自于博客园AskScuti. 实验说明:你不小心Drop掉了一张表数据,且没能及时反应过来,后面才恍然大悟,想利用闪回Drop技术进行闪回操作,可发现表空间被挤占,导致回收站里改表已被清空.如何进行手工不完全还原恢复操作.注:在数据文件.控制文件.在线日志和归档日志都完整的情况下. 基于版本:Oracle 11gR2 11.2.0.4 AskScuti 概念说

mysql误删root后如何恢复root账户

系统:CentOS release 6.5 (Final)内核:2.6.32-431.el6.x86_64MySQL版本:5.5.28-log Source distribution操作步骤:1.停止mysql服务#service mysqld stop2.以安全模式进入mysql#mysqld_safe --skip-grant-tables &#mysql -u root -p \此时密码为空3.重建rootmysql>USE mysql;mysql>INSERT INTO use

一次心惊肉跳的服务器误删文件的恢复过程

经历了两天不懈努力,终于恢复了一次误操作删除的生产服务器数据.对本次事故过程和解决办法记录在此,警醒自己,也提示别人莫犯此错.也希望遇到问题的朋友能找到一丝灵感解决问题. 事故背景 安排一个妹子在一台生产服务器上安装Oracle,妹子边研究边安装,感觉装的不对,准备卸载重新安装.从网上找到卸载方法,其中要执行一行命令删除Oracle的安装目录,命令如下: rm -rf $ORACLE_BASE/* 如果ORACLE_BASE这个变量没有赋值,那命令就变成了 rm -rf /* ==||,妹子使用

MongoDB误删表恢复

一.场景描述 公司某工程师执行db.giveget_card.drop(),误将线上表删除. 幸好每天都有做备份,这个时候就体现了备份的重要性了,哈哈哈... 二.模拟故障过程: 备份数据大小: rs_test01:PRIMARY> use ycsb switched to db ycsb rs_test01:PRIMARY> db.giveget_card.count(); 3173391 删除之前,此表有更新. rs_test01:PRIMARY> db.giveget_card.i

Oracle误删一个表数据的恢复方案

同事找回时操作的数据库为oracle 10g , 之前删除方式为delete 不晓得trancate好使不 SCN(系统改变号),它的英文全拼为:System Change Number ,它是数据库中非常重要的一个数据结构. SCN提供了Oracle的内部时钟机制,可被看作逻辑时钟,这对于恢复操作是至关重要的 注释:Oracle 仅根据 SCN 执行恢复. 它定义了数据库在某个确切时刻提交的版本.在事物提交时,它被赋予一个唯一的标示事物的SCN .一些人认为 SCN 是指, System Co

Ubuntu 14.04 安装nVidia驱动后不能进入图形界面的恢复过程

想要解决Ubuntu14.04的风扇不停的转的问题.由于ubuntu本身不支持双显卡切换,导致集显独显都处于开启状态,发热量和耗电量居高不下. 1. 安装驱动过程 参考[1]中的步骤,做了如下的操作. (1)首先用管理员权限更改/etc/modprobe.d/blacklist.conf,把开源的 Nouveau 驱动加入黑名单. gedit /etc/modprobe.d/blacklist.conf 在文件末尾加上blacklist nouveau (2)安装驱动和Prime apt-get

linux 误删文件后 恢复

LINUX误删文件后,为了把损失降低到最低,进行如下操作: 一:卸载或者以只读的方式挂载需要恢复的分区: example:  umount  /dev/sdb1      #卸载挂载的sdb1 二:安装extundelete   (需要epel源进行支持) example:yum -y install extundelete 三:查看sdb1分区里文件对应的inode example:extundelete /dev/sdb1  --inode 2 文件名    inode    deltete