数据误删一般有两种场景,一是从数据盘直接删除,二是从数据库删除。今天主要介绍场景1数据盘数据误删。
常见情况下来说呢,数据盘数据误删主要有两种场景:
场景一 :在执行rm -rf 删除文件时,该文件正在被进程使用。
场景二:这个文件没有被进程占用,从而被误删除。
所以理论上可以通过block块找回数据,因为上面保存着真实的数据。
风险:如果有进程在在不断地往磁盘写数据时,需要申请新的block块,如果操作系统分配已删除的block块时,新写入的数据就会覆盖原来的数据,此时就会造成数据真正丢失。
在这种情况下,应该第一时间umount目录所在的磁盘,或者不对磁盘进行任何写入,以保证理论数据还存在磁盘上,那么还可以通过相关分析找回数据。
针对场景一 搭建测试环境:
# 创建测试文件夹
mkdir /tmp/test
# 创建测试文件
echo "aaa.al" > /tmp/test/aaa.txt
tail -f /tmp/test/aaa.txt
此时,新开一个终端二,删除aaa.txt文件。
rm -rf /tmp/test/aaa.txt
此时的状态为终端一仍在占用进程,终端二中把文件删除掉了。
场景一恢复:
下面执行恢复操作,使用lsof命令:
# lsof | grep 删除的文件名,如:
lsof | grep aaa.txt
可以看到查询出来的结果处于“deleted”的状态,我需要找到此进程的pid,比如我这里的结果pid为9403。
根据pid号查找文件句柄:
# cd /proc/记录的pid号/fd,如:
cd /proc/1364000/fd
ll
恢复文件,执行以下命令,可以看到数据已经恢复回来了。
cp 3 /tmp/test/aaa.txt.bak
cat /tmp/test/aaa.txt.bak
4、场景二演示
场景二搭建:
我们这里使用单独的一块硬盘来做演示,我这里的硬盘是/sdb1,格式为ext4。
我这里在挂载的目录创建aaa.txt,写入内容和aaa的文件夹。
echo "aaa.al" > /test/aaa.txt
mkdir -p /test/aaa
cd /test
ls
然后对硬盘内容删除:
cd /test
rm -rf *
ls
场景二恢复:
恢复前需要对硬盘进行取消挂载:
umount /test -l
# 创建一个用于恢复数据的目录
mkdir /tmp/test
cd /tmp/test
执行extundelete命令,如果没有此命令,可以直接安装:
yum -y install epel-release
yum -y install extundelete
完成后,执行命令,可以看到最后显示出误删除的文件,状态为Deleted。
开始恢复文件,找到我们需要恢复文件的Inode number,比如我这里图示为12,则执行以下命令,执行后,会在当前目录下生成RECOVERED_FILES目录,里面包含我们恢复的文件:
同样还可以恢复文件夹和所有文件,命令格式如下:
1)通过inode号(extundelete /dev/sdb1 --restore-inode InodeNum)
2)通过file文件名(extundelete /dev/sdb1 --restore-file FileName)
3)通过directory目录名(extundelete /dev/sdb1 --restore-directory DirectoryName)
4)all全部恢复(extundelete /dev/sdb1 --restore-all)
同样的xfs格式可以使用xfs_undelete工具修复
下载地址https://github.com/ianka/xfs_undelete
tcllib下载地址:https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/t/tcllib-1.14-1.el7.noarch.rpm
xfs文件系统删除恢复
查看文件系统格式
df -h
cd /data
ls -l
ls -l ahi-python
find ./ -name *.gz|xargs ls -l
rm -rf /data/*
发现误删除文件后,立马把误删除文件所在的分区设置成只读状态,或者卸载掉该分区,让分区没有写操作
umount /data/
使用xfs_undelete工具修复
误删文件所在的文件系统格式是xfs,所以选择了xfs_undelete工具进行修复
https://github.com/ianka/xfs_undelete
tcllib下载地址:
https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/t/tcllib-1.14-1.el7.noarch.rpm
源码安装tcllib
# tar -xf pgs.tar.gz
# cd pgs/ # tar -xf tcl8.6.11-src.tar.gz
# cd tcl8.6.11/unix/
# ./configure && make && make install
# cd /opt/pgs/
# ls -l
执行xfs_undelete工具找回误删的文件
# unzip xfs_undelete-master.zip
# cd xfs_undelete-master
# ls -l
存放在目录下./xfs_undeleted,文件和之前的有差异,根据文件比对找到对应的数据,主要恢复sh、py和zip文件
# find ./ -name *.gz|xargs ls -l
# tar -tf ./2021-02-24-21-00_423425453.tar.gz|head -n 10
使用testdisk工具找回文件
这个工具使用比较简单,无需源码编译,解压即可使用
https://www.cgsecurity.org/wiki/TestDisk
photorec找回文件
# tar -xf testdisk-7.2-WIP.linux26-x86_64.tar.bz2
# cd testdisk-7.2-WIP
# ]# mkdir data_recovery
# ./photorec_static
选择/dev/mapper/centos-data逻辑分区 ,Proceed继续
选择XFS分区,file opt可以选择修复的文件类型,如txt压缩等等,最后选择search继续
选择other文件系统,enter继续
选择要恢复文件所要存放的路径
开始恢复文件