--把扫描到的已删除文件恢复出来
[root@ora10g ~]# ext3grep /zlm/test1 --restore-all
Running ext3grep version 0.10.2
Number of groups: 13
Minimum / maximum journal block: 519 / 4633
Loading journal descriptors... sorting... done
The oldest inode block that is still in the journal, appears to be from 1409119917 = Wed Aug 27 14:11:57 2014
Number of descriptors in journal: 32; min / max sequence numbers: 2 / 10
Writing output to directory RESTORED_FILES/
Loading test1.ext3grep.stage2... done
Restoring redo01.log
Restoring redo02.log
Restoring redo03.log
注意,在哪个目录执行ext3grep命令恢复文件,就会在该目录中生成一个RESTORED_FILES子目录,下面存放所有恢复出来的文件,并且这个目录下的文件是隐含属性的。
[root@ora10g ~]# ls -la RESTORED_FILES/
total 28
drwxr-xr-x 3 root root 4096 Aug 27 14:17 .
drwxr-x--- 17 root root 4096 Aug 27 14:17 ..
drwx------ 2 root root 4096 Aug 27 13:59 lost+found
-rw-r--r-- 1 root root 3 Aug 27 14:12 redo01.log
-rw-r--r-- 1 root root 3 Aug 27 14:12 redo02.log
-rw-r--r-- 1 root root 3 Aug 27 14:12 redo03.log
如果不想全部恢复,那么可以使用--resotre-file filename的方式来恢复,前提是你必须知道哪些是你需要恢复的文件
--重新挂载磁盘并确认已经挂载成功
[root@ora10g ~]# mount -o loop /zlm/test1 /oradata/ora10g
[root@ora10g ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
ext3 7.7G 5.6G 1.7G 77% /
/dev/sda1 ext3 99M 12M 82M 13% /boot
tmpfs tmpfs 506M 0 506M 0% /dev/shm
/zlm/test1 ext3 96M 5.6M 86M 7% /oradata/ora10g
--把丢失的文件从RESTORED_FILES中复制到源路径中
[root@ora10g ~]# cp RESTORED_FILES/*.log /oradata/ora10g
[root@ora10g ~]# cd /oradata/ora10g/
[root@ora10g ora10g]# ll
total 15
drwx------ 2 root root 12288 Aug 27 13:59 lost+found
-rw-r--r-- 1 root root 3 Aug 27 14:21 redo01.log
-rw-r--r-- 1 root root 3 Aug 27 14:21 redo02.log
-rw-r--r-- 1 root root 3 Aug 27 14:21 redo03.log
--验证被恢复文件的内容
[root@ora10g ora10g]# cat redo01.log redo02.log redo03.log
AB
CD
EF
[root@ora10g ora10g]#
至此,3个文件被完整的恢复了,包括文件内容也都没有丢失。
总结:
可以看到,之前模拟在文件系统类型为ext3的/zlm/test1分区下rm -f误删除掉的数据文件都是可以恢复出来的,但前提是删除后没有写入操作,如同我们window中删除磁盘上的数据的原理一样,就算是误格式化了分区,只要没有写入过新的数据,还是能通过Easy Recovery之类的软件对数据进行恢复的。所以,当我们在Linux下误删文件,如果这个文件是挂载在某个分区下的,那么请立即卸载该分区,然后通过以上介绍的方法,对数据进行恢复。不过用这种方法恢复,需要你的数据库文件单独挂在在一个分区下,如果是直接用默认的放在/dev/mapper/VolGroup00-LogVol00,我测试过,是无法恢复出文件的,扫描会失败。
在我的实验中,由于是测试环境,没有单独给数据文件分区,只是默认地安装,测试效果可能与实际环境有很大的区别,这里只是提供数据恢复的一种思路。先用创建了一个文件模拟一个磁盘,如:/zlm/test1并把它格式化成ext3grep的文件系统,ext3grep顾名思义,就是用在对ext3文件系统上进行数据文件恢复的工具,对于ext2、xfs等文件系统而言,它就爱莫能助了。当然,我相信还是能有其他方法或工具可以恢复数据的,这里就暂且不研究了。
所以对于数据库系统而言,极力推荐把数据文件单独挂在在磁盘的分区中,而不是采用默认的磁盘分区,如果要使挂载永久生效,还要修改/etc/fstab文件,加入你要挂载的分区和目录信息。一旦发生误删除,而你的文件系统又恰巧是ext3,而数据库又意外地被关闭了。那么,ext3grep也许就是你最后的机会了!