linux 误删除mysql表能恢复吗,Linux误删数据恢复

引子

指在键上飘,难免会湿手套。当你按下shift+del键后,会不会突然心里凉透,当你执行rm -rf后,会不会马上去搜索哪个国家入境不需要签证。或者你还会遇到如下的情况:

root@4xem7:~# alias

alias cd='rm -rf'

alias d='docker'

数据恢复原理浅析

8531f6c9345f0ecd2cd19720af093362.png

如图所示,硬盘上数据的存放有一个类似于书本目录的东西存在,就是图中最上面那一排圆形。硬盘格式化后,被分割成了很多个小块,就像蜂巢一样,一个个的小房间,就是上图中间部分的长方块,这个小房间才是真正存放数据的地方,最下面的数字,是房间号,也就是inode号。如果我们要使用文件A,在最上面的目录里面就能很快的知道文件A在1号房间。

➤什么情况下,被误删的数据能恢复

误删情况发生后,第一重要的事情就是卸载误删数据所在的分区,而不是关机,绝对不能关机,为什么?现在所有的系统优化,其本质就是把硬盘IO转换成内存IO,就是把本该到硬盘里面去读写的内容,提前预载到内存里面去。你若正常关机,redis持久化的数据,可能有好几个G,mysql的InnoDB_Buffer_Pool缓冲池里面的东西(可能有好几十个G),这些东西往硬盘里面一写,你还想恢复数据,等我发明时光机吧。为什么说马上卸载分区,数据就能恢复。看下图,rm -rf删除了A文件。

d6258368255169881a1d1de5784983fc.png

其实,系统只是删除了目录里面的文件指向,文件A还好好的趟在1号房间里面。所以这种情况,文件是能很轻松的恢复的。

➤什么情况下,被误删的数据不能恢复

承接上一张图,目录里面显示1号房间是空的,可以重新放数据进去,若此时,硬盘又接收到写入请求(比方说你脑抽,把数据恢复软件安装到了误删数据所在的分区),就会把数据写入1号房间:

cbd6b55ab22ebbc95724fa9f2bc828d4.png

此时,你若还想恢复数据,只能等我发明时光机了。

extundelete恢复举例

extundelete可以恢复ext3、ext4文件系统下被误删的文件,看其恢复原理xfs文件系统应该也是可以恢复的。

安装extundelete

在安装extundelete前,需要安装e2fsprogs和e2fsprogs-libs,自行用yum安装就可以。

[root@dish ~]# rpm -qa |grep e2fsprogs

e2fsprogs-libs-1.41.12-22.el6.x86_64

e2fsprogs-1.41.12-22.el6.x86_64

epel源里面有extundelete,直接安装就行。

[root@dish ~]# yum install extundelete -y

[root@dish ~]# rpm -ql extundelete

/usr/bin/extundelete

/usr/share/doc/extundelete-0.2.4

/usr/share/doc/extundelete-0.2.4/LICENSE

/usr/share/doc/extundelete-0.2.4/README

extundelete常用参数解释

Options:

--superblock 显示超级块信息,默认选项.

--journal 显示日志信息.

--after dtime 表示在某段时间之后被删除的文件或目录.

--before dtime 表示在某段时间之前被删除的文件或目录.

Actions:

--inode ino Show info on inode 'ino'.

--block blk Show info on block 'blk'.

--restore-inode ino[,ino,...]

恢复指定inode号的文件,恢复出来的文件会放在当前目录下的RECOVERED_FILES文件夹中

--restore-file 'path' 恢复指定路径的文件

--restore-files 'path' 恢复在路径中列出的所有文件

--restore-all 尝试恢复所有目录和文件

恢复文件

➤测试文件

[root@dish reco]# for i in A B C D;do echo "this is file$i">$i;done

[root@dish reco]# cat A B C D

this is fileA

this is fileB

this is fileC

this is fileD

[root@dish reco]# find ./ -type f |xargs md5sum >./file.md5

[root@dish reco]# cat file.md5

d41d8cd98f00b204e9800998ecf8427e ./file.md5

c2f9bc9edb959d08dc838af14c5cd8ff ./C

afc688bfcd0666302ed55da472ecfbb8 ./B

0a540f40e1e8c3e5ad50571f1621d5b3 ./A

2c3fdd8c8e23a1ba2d0381981f337348 ./D

[root@dish reco]# rm -rf A B C D

[root@dish reco]# ls

file.md5

➤卸载磁盘分区

发现数据误删后,只做一件事,卸载数据所在分区

[root@dish reco]# cd

[root@dish ~]# umount /dev/vdb1

➤查询可恢复的数据

首先查看数据所在目录reco的inode号

[root@dish ~]# extundelete /dev/vdb1 --inode 2 |grep reco

reco 131073

reco目录的inode号131073

[root@dish ~]# extundelete /dev/vdb1 --inode 131073 |tail

Triple indirect block: 0

File name | Inode number | Deleted status

. 131073

.. 2

A 131074 Deleted

B 131075 Deleted

C 131076 Deleted

D 131077 Deleted

file.md5 131078

如上所示,标记为Deleted状态的就是误删的文件,同时还能看到对应文件的inode值,有了这些,我们就可以恢复文件了。

[root@dish ~]# extundelete /dev/vdb1 --restore-file reco/C

NOTICE: Extended attributes are not restored.

Loading filesystem metadata ... 160 groups loaded.

Loading journal descriptors ... 2858 descriptors loaded.

Successfully restored file reco/C

[root@dish ~]# extundelete /dev/vdb1 --restore-file reco/D

NOTICE: Extended attributes are not restored.

Loading filesystem metadata ... 160 groups loaded.

Loading journal descriptors ... 2858 descriptors loaded.

Successfully restored file reco/D

--restore-file 后面的reco/C是个相对路径,其原本的路径是/bak/reco/C,而bak目录挂载的就是/dev/vdb1。文件恢复成功后,会在你执行恢复命令的当前目录生成一个RECOVERED_FILES目录,恢复出来的文件就在里面。

[root@dish ~]# cd RECOVERED_FILES/reco/

[root@dish reco]# md5sum -c file.md5

./C: OK

./B: OK

./A: OK

./D: OK

恢复出来的文件经过MD5校验全通过。恢复成功。

恢复目录

[root@dish reco]# mkdir mulu

[root@dish reco]# cd !$

cd mulu

[root@dish mulu]# touch {01..09}

[root@dish mulu]# ls

01 02 03 04 05 06 07 08 09

[root@dish mulu]# cd ..

[root@dish reco]# rm -rf mulu

[root@dish reco]# cd

[root@dish ~]# r umount

umount /dev/vdb1

[root@dish ~]# extundelete /dev/vdb1 --restore-directory /reco/mulu

NOTICE: Extended attributes are not restored.

Loading filesystem metadata ... 160 groups loaded.

Loading journal descriptors ... 2857 descriptors loaded.

Searching for recoverable inodes in directory /reco/mulu ...

10 recoverable inodes found.

Looking through the directory structure for deleted files ...

2 recoverable inodes still lost.

[root@dish reco]# ls mulu/

01 02 03 04 05 06 07 08

目录被成功恢复,注意,目录里面的空文件是无法恢复的,09就是一个空文件。

恢复所有文件

需要恢复的文件数量过多的时候,可以用这个选项。

[root@dish tmp]# extundelete /dev/vdb1 --restore-all

恢复某个时间点之后删除的文件

这个应该是用的最多的场景了,比方说需要恢复一个小时内被删除的文件。

extundelete --after `echo $(date +%s)-3600 |bc` --restore-all /dev/vdb1

一个小时3600秒,根据自己需求修改上面的减数。

原创文章,转载请注明: 转载自笛声

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339701.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache Camel 3.1 –更多骆驼核心优化(第3部分)

我以前曾在博客中介绍过我们在下一个Camel 3.1版本中所做的优化 博客第1部分 博客第2部分 今天,我想简短介绍一下我们已经完成的最新开发,因为我们准备在本周末或下半年准备好构建和发布Camel 3.1。 从第2部分开始,我们设法在路由过程中将…

jvm jinfo 参数_jinfo:JVM运行时配置的命令行浏览

jvm jinfo 参数在最近的一些博客中(特别是在对Java EE 7性能调优和优化以及WildFly性能调优的书中的评论中),我引用了自己过去在某些Oracle JDK命令行工具上的博客文章。 令我震惊的是,我从来没有专门解决过漂亮的jinfo工具&#…

49自动化测试中最常见的硒异常

开发人员将始终在编写代码时牢记不同的场景,但是在某些情况下,实现可能无法按预期工作。 相同的原则也适用于测试代码,该代码主要用于测试现有产品的功能,发现错误以及使产品100%不受错误影响。 正确地说,…

鹰式价差matlab,鹰式期权:什么叫铁鹰式期权组合,蝶式价差期权?

蝶式期权套利 是利用 交割月份的价差进行 套期获利, 个方向相 反、 共享居中交割月份合约的跨期套利组成。是一种期权策略,风险有限,盈利也有限,是由一手牛市套利和一手熊市套利组合而成的。铁鹰式期权组合是牛市看跌价差期权组合…

angular8 rest_带有Angular JS的Java EE 7 – CRUD,REST,验证–第2部分

angular8 rest这是Angular JS承诺的Java EE 7的后续版本–第1部分 。 花了比我预期更长的时间(找到时间来准备代码和博客文章),但是终于到了! 应用程序 第1部分中的原始应用程序只是带有分页的简单列表,以及提供列表数…

带有Java Pojo作为输入输出示例的AWS Lambda函数

在上一教程中,我们看到了如何使用Java创建AWS Lambda函数,并传递了String作为输入,还返回了String作为Output。如果您是第一次创建lambda函数,我建议先阅读该教程。 在本教程中,我们将看到如何传递Java普通的旧Java对…

php右侧弹窗QQ客服,JavaScript_网页右侧悬浮滚动在线qq客服代码示例,网页右侧悬浮滚动QQ在线客服 - phpStudy...

网页右侧悬浮滚动在线qq客服代码示例网页右侧悬浮滚动QQ在线客服代码function myEvent(obj,ev,fn){if (obj.attachEvent){obj.attachEvent(onev,fn);}else{obj.addEventListener(ev,fn,false);};};function getbyClass(id,sClass){var oParent document.getElementById(id);va…

idea spark java,IntelliJ Idea 搭建spark 开发环境

笔者介绍的是在MAC环境下使用Idea搭建spark环境。环境:spark 2.0.0scala 2.11.8maven 3.9.9idea 151.Idea的安装.Idea可以在官网上下载。熟悉java的肯定都知道这个开发利器,可以在官网上进行下载,在此就不在赘述。有免费的和付费版本,对于我们…

optaplanner_OptaPlanner –具有真实道路距离的车辆路线

optaplanner在现实世界中,车辆路径问题(VRP)中的车辆必须走这条路:它们不能在客户之间直线行驶。 大多数VRP研究论文和演示都乐于忽略此实现细节。 和我一样,过去。 尽管使用道路距离(而不是空中距离&#…

java中的jpa_JPA教程–在Java SE环境中设置JPA

java中的jpaJPA代表Java Persistence API,它基本上是一个规范,描述了一种将数据持久存储到持久存储(通常是数据库)中的方法。 我们可以将其视为类似于Hibernate之类的ORM工具的东西,除了它是Java EE规范的正式组成部分…

php中des加密cbc模式,php中加密解密DES类的简单使用方法示例

本文实例讲述了php中加密解密DES类的简单使用方法。分享给大家供大家参考,具体如下:在平时的开发工作中,我们经常会对关键字符进行加密,可能为了安全 也可能为了规范,所以要正确使用DES加密解密代码1:class DES{var $k…

java 并发线程_Java并发教程–线程之间的可见性

java 并发线程当在不同线程之间共享对象的状态时,除了原子性外,其他问题也会发挥作用。 其中之一是可见性。 关键事实是,如果没有同步,则不能保证指令按照它们在源代码中出现的顺序执行。 这不会影响单线程程序中的结果&#xff…

维持硒测试自动化的完美方法

毫无疑问, 自动浏览器测试已经改变了软件开发的工作方式。 如果不是Selenium,我们将无法像我们一样使用各种各样的无错误Web应用程序。 但是有时,甚至IT部门也误解了自动化一词。 大多数人认为计算机将为他们完成所有测试! 他们最…

双色球霸主网络问题_霸主–统治和管理API的地方

双色球霸主网络问题今天我们生活在一个越来越分散的世界中。 如今的计算机系统不再是在随机桌子下面的某些硬件上运行单个部门项目,而是大规模,集中甚至分散地运行。 监视和管理的需求从未改变,但是随着时间的推移变得越来越复杂。 如果将所有…

php验证码 php中文网,ThinkPHP 使用不同风格及中文的验证码

使用其他风格验证码在上文《ThinkPHP 验证码详解及实例》中了解了 ThinkPHP 验证码的具体用法,本文将进一步介绍如何使用不同风格的验证码以及使用中文验证码。上文例子使用的是默认参数,也就是生成 4 位的数字验证码。buildImageVerify 方法生成验证码时…

java 开发人员工具_Java开发人员应该知道的5种错误跟踪工具

java 开发人员工具随着Java生态系统的发展,可满足不断增长的请求和用户对高性能需求的Web应用程序成为了新型的现代开发工具。 具有快速新部署的快速节奏环境需要跟踪错误,并以传统方法无法维持的水平获得对应用程序行为的洞察力。 在本文中,…

Apache Camel 3.2 – Camel的无反射配置

在Apache Camel项目中,我们正在努力开发下一个即将发布的下一个Apache Camel 3.2.0版本。 我们在Camel 3中努力研究的问题之一就是使其变得更小,更快。 其中一个方面是配置管理。 您可以按照12要素原则以多种方式完全配置Camel,以使配置与应…

java jsoup解析_3使用Jsoup解析Java中HTML文件的示例

java jsoup解析HTML是Web的核心,无论您是通过JavaScript,JSP,PHP,ASP或任何其他Web技术动态生成的,您在Internet上看到的所有页面都是基于HTML的。 您的浏览器实际上是解析HTML并为您呈现它。 但是,如果需要…

【AI提示词艺术】第12期 摄影艺术构图处理和人像生成的技巧

摄影艺术构图 星空宇宙 关键词: 强烈的明暗对比,8k,精细的描述,相片纸,超高分辨率,无建筑的,大自然,星空,云朵,刺眼流星,群星,银河,仰视视角,广角镜头 以下是按照提示词类别整理的相关描述&a…

Kogito,ergo规则:从知识到服务,轻松自如

欢迎阅读有关Kogito倡议的博客系列的另一集,以及我们将Drools带入云的努力。 这些文章的目的是收集用户对我们提供给Kogito的功能的早期反馈。 在本文中,我们介绍了两种实现完整智能服务的新方法 : 独立的规则服务 集成智能工作流程和规则…