警告:若数据块被覆盖,则无法恢复,第一时间问清楚是什么时候删除的数据,叮嘱不要继续再动了。
一、文件删除原理
在ext3/4文件系统中,inode索引节点除了存放文件属性还指向文件的block节点,是书的目录,block存放文件的实际数据,是书的每一页,文件的上级目录的block存放的是文件名及其inode节点编号,删除文件实际上是删除文件名和inode节点编号的关联以及inode节点内的指针信息,那么实际上,文件的block还在,加上ext3/4文件系统是日志文件系统,格式化时会分配一个固定大小的空间的日志文件journal,它记录创建和删除文件的记录,当删除一个文件,操作系统首先把文件inode信息和文件名称写入到journal,然后删除文件并清空inode原始数据指针。
二、有两种情况无法恢复
1)当新的数据写入到被删除文件占用的block后,原来的inode号就指向新的数据,那么这样是无法找回的。
2)当journal日志文件存满之后,会释放前面的空间,循环使用,存放最新的记录,如果删除文件的记录被覆盖,是恢复不了的。
三、恢复文件的原理
根据journal日志文件残留inode的信息,定位到相关目录,恢复残留inode对应的block。但日志文件恢复只适合小数据量的恢复,因为journal的空间有限,存放不了太多记录。对于大文件如oracle等数据库文件恢复采用逆向推算和数据文件本身特点来提取。
四、恢复过程
安装恢复软件extundeleteyum install extundelete -y
如果是挂载的磁盘请卸载磁盘
umount -lf /dev/sdb
从根节点开发扫描,扫描结果如下所示
extundelete --inode 2 /dev/sda2
找到被删除文件所在的父目录或祖父目录的号码继续向下扫描(目录的inode号是其目录下面其他文件的开始的inode号,所以以它为基准向下扫描)
被删除的文件在3306目录,所以继续以3306的inode号为起始扫描
extundelete --inode 3801090 /dev/sda2
恢复被删除的文件(执行这条命令前,请cd进入到空间足够的分区,以免恢复造成空间不足)
extundetele --restore-inode 3801094 /dev/sda2
文件恢复后存放在执行命令时所在目录下的RECOVERED_FILES目录下,名称已变,建议文件数不多,一个个恢复再改名
恢复整个文件夹则不用改名,做这步前最好把文件夹中的内容备份到其他地方,以免恢复被覆盖,未测试过
extundelete /dev/sda2 --restore-directory /data/3306/
注意事项
如果是生产环境,上面有其他业务,应该确保在用户访问量最低的半夜进行,恢复需要卸载磁盘,不卸载没有尝试过,主要是有数据还在写入到磁盘,容易出错。
善后工作
收回非必要的权限,目录755,文件644,上线代码可用jenkins配合shell,shell拷贝前备份原来的包,如果没有这套最好让运维人员帮助上线,原则上开发人员没有任何权限。顶多给一个启动相关服务,查看相关日志的权限。公司最重要的是制度流程,什么人有什么权限必须要有书面规定,人员要权限也必须有申请记录,以免自己背黑锅!