前几天一不小心删除了公司MySQL数据库的表,同时MySQL又没有开启log_bin日志,于是想到在OS层恢复数据(特殊说明:MySQL的每张表都会以.myi .myd .frm三个后缀的三个文件保存在数据库名称下的目录中)。于是这段时间都在研究了OS怎么恢复文件


  Linux下误删数据一般分为两种情况:

情况一:

   系统中有多个用户在线,有一个或者多个用户在对一个文件进行编辑,这时另外一个用户误删这个编辑文件。

 恢复原理

    我们明白Linux系统中任何操作都会在系统中打开一个文件,同时每个打开的每个文件都会有一个PID。所以,我们可以利用lsof这个命令来查找到当前打开文件PID,然后进行其回复。

 涉及命令

    lsof | grep -i delete
    cp /proc/file_PID/fd/# /path/file_name

 操作实例

  首先,我使用root用户登陆系统,拷贝/etc/passwd 文件至当前目录,然后向passwd文件中写入“This a test”。如图



  然后,使用root在另外一个接口登陆,删除passwd文件,并查看当前目录下的passwd文件是否删除成功。如图


  

最后,我们采用lsof命令进行恢复。如图



  这里的cat是表示操作文件的命令,1054表示文件的PID(重要),root表示由什么用户操作,1w表示文件字节长度(重要),265786表示文件大小,最后一个字段表示文件目录与状态。

  下面我们通过查找proc目录下1054目录中fd目录,下的1字段来恢复数据。如图



  最后,我们查看这个/tmp/passwd文件是否恢复成功。如图



  到此,第一种情况下的数据恢复完成。


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------


情况二:

   在实际工作中遇见更多的情况是,我们只有一个用户在线操作文件。这种情况下,如果我们误删数据怎么恢复。

 恢复原理

   我们任何一个文件存入硬盘时,都会有一个inode号,我们现在恢复数据就是利用文件的inode号进行恢复。所以,在我们发现误删操作后,正确的操作是,1、停止误删文件的分区上所有写入操作,2、利用umount取消挂载,3、通过dd if=/path/filename of=/dev/sda1备份分区(防止数据恢复失败时,造成数据在丢失),4、通过extundelete命令查找误删数据并恢复。

 涉及命令

   umount /dev/sda1 or umount /mount_poit
   dd if=/path/filename of=/dev/sda1
   extundelete --inode 2 /dev/sda1
   extundelete --restore-file

 操作实例

   首先,我在/app目录下创建一个aixe目录,并拷贝/etc/passwd /etc/shadow /etc/group 三个文件到该目录中,然后删除aixe目录。如图



   接下来,我通过df命令查看/app是独立分区,然后通过umount目录取消/app的挂载(注意:这里只是测试,没有使用dd命令备份)。如图



   下面通过wget http://ncu.dl.sourceforge.net/project/extundelete/extundelete/0.2.0/extundelete-0.2.0.tar.bz2 下载extundelete文件,并进行编译安装。注意,在安装extundelete之前需要安装它所需要的支持文件,即:yum -y install e2fsprogs e2fsprogs-libs e2fsprogs-devel。如图



  接下来对文件进行编译安装。如图



  下面通过extundelete --inode 2 /dev/sda5命令来查找删除的文件(有兴趣的朋友可以通过extundelete --help命令查看更多的extundelete参数)。如图




  可以看到,我们误删的aixe目录,它的inode是913921,状态是deleted。最后,我们通过extundelete --restore-all /dev/sda5 命令进行恢复。恢复完成后,会在用户当前目录下创建一个RECOVERED_FILES目录,存放恢复文件。如图



 查看一下恢复文件的内容(这里只随机查看了passwd文件)。如图



   可以看到已经恢复成功了。最后只需要把刚刚取消挂载的分区,重新挂载回去,然后把恢复数据拷贝原路径下即可。


      最后友情提示:

                     黄金有价,数据无价。操作需谨慎!!!




Logo

更多推荐