此前 MySQL数据库数据遭到损坏,原因未知。猜想是进行了系统及删除操作或者数据库二进制文件损坏。

首选,我们针对系统全盘进行备份,以避免数据二次伤害;

根据猜想,首先确定数据库二进制文件损坏,准备利用 bin-log 来尝试恢复
mysql> show variables like '%log_bin%';

查看下 bin-log 的当前状态,很遗憾虽然开启了但是并没有可恢复的 log 数据

那么这种方法恢复数据的操作就先不说了,有机会会再次分享出啦

开始进行系统级的全盘恢复,这里主要使用extundelete,这里简单概述下原理:

在Linux下可以通过"ls –id"命令来查看某个文件或者目录的inode值,例如查看根目录的inode值,可以输入:
ls -id /

由此可知,根目录的inode值为2。

在利用extundelete恢复文件时并不依赖特定文件格式,首先extundelete会通过文件系统的inode信息(根目录的inode一般为2)来获得当前文件系统下所有文件的信息,包括存在的和已经删除的文件,这些信息包括文件名和inode。然后利用inode信息结合日志去查询该inode所在的block位置,包括直接块,间接块等信息。最后利用dd命令将这些信息备份出来,从而恢复数据文件。

下面开始实战,首先安装extundelete

yum install extundelete -y

反查删除数据,比如说在/boot 目录下删除了一些文件,那么就先查看下这个目录的 id

ls -id /boot

使用 df 查看当前分区

我这边的这个是/dev/vda1

使用指令查看此目录下已删除的文件

extundelete /dev/vda1 --inode (刚才查到的目录 id)

可能的结果大概如下,那么后面带有 deleted 就表示这个文件是被删除过了的,使用指令恢复它吧

extundelete /dev/vda1 --restore-file symvers-2.6.32-431.el6.x86_64.gz

这里需要注意的是,还原成功的文件不是立即覆盖到原目录下的,而是在当前目录下生成一个 RECOVERED_FIFES一个目录,进入到这个目录就看到文件了

避坑指南:
值得注意的是,我们一般只有挂载一个盘,而使用extundelete恢复会有个提示需要卸载磁盘分区的,不必去管它,直接 y 即可。

比如我这个问题,不知道哪里数据损坏了怎么办 ?那就全分区恢复,找到 MySQL 二进制文件关键字全部替换文件回去吧。

恢复整个磁盘:

extundelete /dev/vda1 --restore-all

  1. 还有那就是在恢复过程中恢复单个文件或文件夹总是出现错误提示,如下:

extundelete: Operation not permitted while restoring directory.
extundelete: Operation not permitted when trying to examine filesystem

那就直接尝试恢复全盘吧。值得说明的是,这里的恢复全盘只是恢复被删除的文件,一般时间会很短的,除非你 rm 了整个 linux 目录哈

意外惊喜:
此方法即使 rm 删除操作也是可以恢复的哦~

另外,恢复时候必须保证对应的文件没有被覆盖重写后再删除过,简单的说,一旦发现数据异常 ,那么就不要再动了。直接备份然后找专业人士解决吧