文章目录

  • Linux操作系统文件删除原理
  • 如果误删除文件或者数据我们怎么办?
    • 实验思路:
    • 1 . 新加硬盘
    • 2. 进行分区
    • 3. 使用新的分区表,格式化并挂载:
    • 4. 复制一些测试文件,然后把这些文件删除,然后演示恢复:
    • 5. 安装extundelet 进行文件的恢复操作
      • 1) 上传extundelete到linux中:
      • 2) 解压并安装extundelte
      • 3) 尝试进行恢复
        • 方法1:通过inode结点恢复
        • 方法2:通过文件名恢复
        • 方法3:恢复某个目录,如目录a下的所有文件:
        • 方法4:恢复所有的文件
  • 总结:备份数据是王道

删库是不可能删库的,这辈子都不可能删库的,删根行吗?
满足你:

[root@zmgaosh ~]# rm -rf /
rm: 在"/" 进行递归操作十分危险
rm: 使用 --no-preserve-root 选项跳过安全模式
[root@zmgaosh ~]# 

写在前面:
博主是一名投身教培事业的标准八零后,叛逆而且追求自由,昵称取自于苏轼的《水调歌头》中的“高处不胜寒”,时刻提醒自己要耐得住寂寞,受的了孤独,在技术的道路上,不畏艰难,勇往直前。
我已经将全部的linux运维体系整理到了gitee上,https://gitee.com/gaosh08/LinuxFamily
欢迎star,投稿,交流,后续还会有python系列和java系列。

今天我们不删数据库,我们来聊聊误删除文件如何能不能恢复?

  • 不能

你选哪个,答案是能,这事我们得先从原理讲起

Linux操作系统文件删除原理

Linux文件系统由三部分组成:文件名,inode,block

zmedu.txt -->inode --> block
文件名 存放文件元数据信息 真正存放数据

文件存储在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。

操作系统读取硬盘的时候,不会一个个扇区的读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)。这种由多个扇区组成的“块”,是文件存取的最小单位。“块”的大小,最常见的是4KB,即连续八个sector组成一个block。

文件数据都储存在“块”中,那么很显然,我们还必须找到一个地方储存文件的“元信息”,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。

我们访问的任何数据,都是先找到inode,然后根据inode去找到相应硬盘的位置。如果没有inode号,就无从找到硬盘上的数据。

这个inode号在哪里呢?

[root@zmgaosh ~]# ls -i b.txt
262170 b.txt   

从上个例子看一看到b.txt的inode号是262170

-在inode里面包含的元信息,具体内容如下:

  • Size 文件的字节数
  • Uid 文件拥有者的User ID
  • Gid 文件的Group ID
  • Access 文件的读、写、执行权限 文件的时间戳,共有三个:
    Change 指inode上一次变动的时间
    Modify指文件内容上一次变动的时间
    Access 指文件上一次打开的时间
  • Links 链接数,即有多少文件名指向这个inode
  • Inode文件数据block的位置
  • Blocks 块数
  • IO Blocks 块大小
  • Device 设备号码

我们还可以通过stat来查看inode的信息

[root@zmgaosh ~]# stat b.txt文件:"b.txt"大小:25              块:8          IO 块:4096   普通文件
设备:fd01h/64769d      Inode:262170      硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2020-06-19 20:55:39.327737431 +0800
最近更改:2020-06-19 20:55:34.924697772 +0800
最近改动:2020-06-19 20:55:34.926697790 +0800
创建时间:-

敲黑板: 在Linux操作系统中,文件名只是inode号码便于识别的绰号,操作系统通过inode号来识别文件,而非文件名。

作为用户我们打开一个文件,在系统内部的流程是这样的:

  1. 系统找到这个文件名对应的inode 号码
  2. 通过inode号码,获取inode信息
  3. 根据inode信息,找到文件数据所在的block,读出数据

同样的Linux系统是通过link的数量来控制文件删除的,删除指的是文件名到inode的链接被删除了,但是文件在磁盘上的block数据块并未被删除。

所以我们想要恢复,只需要恢复对应的inode节点号就可以恢复数据,但前提是,数据没有被覆盖掉。
那么问题来了: 误删除文件之后,我们第一时间要做的事情是什么?

  • 辞职跑路
  • 卸载要恢复的文件分区
  • 要恢复的分区以只读的形式挂载

跑路是不可能跑路的,这辈子都不会跑路的!

如果误删除文件或者数据我们怎么办?

既然事情已经发生,作为运维我们只能上手解决,还好我遇到了它。extundelete

下载网址:http://sourceforge.net/

实验思路:

  1. 虚拟机新加一块硬盘(此硬盘用于创建数据,删除数据,恢复数据的模拟)
  2. 对新加的硬盘sdb进行分区,格式化,以及挂载
  3. 在新盘上进行创建数据,然后删除数据
  4. 对数据进行恢复

1 . 新加硬盘





2. 进行分区

[root@gaosh63 /]# fdisk /dev/sdb  #对sdb进行分区Command (m for help): n   #创建一个新分区
Command actione   extendedp   primary partition (1-4)
p  #创建一个主分区
Selected partition 1Last cylinder, +cylinders or +size{K,M,G} (1428-2610, default 2610): +1G  #指定分区大小Command (m for help): w  #保存

[root@gaosh63 ~]#reboot

[root@gaosh63 ~]# partx -a /dev/sdb #获得新分区表

3. 使用新的分区表,格式化并挂载:

[root@gaosh63 /]# mkdir /tmp/sdb     #创建挂载点
[root@gaosh63 ~]# mkfs.ext4 /dev/sb1    #格式化
[root@gaosh63 ~]# mount /dev/sdb1 /tmp/sdb/   #挂载

4. 复制一些测试文件,然后把这些文件删除,然后演示恢复:

[root@gaosh63 ~]# cp /etc/passwd /tmp/sdb1/
[root@gaosh63 ~]# cp /etc/hosts /tmp/sdb/
[root@gaosh63 ~]# echo aaa > a.txt
[root@gaosh63 ~]# mkdir -p /tmp/sdb/a/b/c
[root@gaosh63 ~]# cp a.txt /tmp/sdb/a/
[root@gaosh63 ~]# cp a.txt /tmp/sdb/a/b/
[root@gaosh63 ~]# touch /tmp/sdb/a/b/text.txt   #创建一个空文件,看空文件是否能够恢复

开始删除文件:

[root@gaosh63 ~]# cd /tmp/sdb/
[root@gaosh63 sdb]# ls
a  hosts  lost+found  passwd
[root@gaosh63 sdb]# rm -rf a hosts passwd

误删除文件后我们要第一时间卸载分区或者以只读方式挂载:

[root@localhost ~]#cd /root
[root@localhost ~]# umount /tmp/sdb

5. 安装extundelet 进行文件的恢复操作

1) 上传extundelete到linux中:
2) 解压并安装extundelte
[root@gaosh63 extundelete-0.2.4]# tar jxvf extundelete-0.2.4.tar.bz2
[root@gaosh63 ~]# cd extundelete-0.2.4
[root@gaosh63]# yum install e2fsprogs-devel
[root@gaosh63 extundelete-0.2.4]# ./configure   #检查系统安装环境[root@gaosh63 extundelete-0.2.4]# make  -j 4  #编译
[root@gaosh63 extundelete-0.2.4]# make install  #安装
3) 尝试进行恢复

方法1:通过inode结点恢复
方法2:通过文件名恢复
方法3:恢复某个目录,如目录a下的所有文件:
方法4:恢复所有的文件

[root@gaosh63 ~]# mkdir test  #创建一个目录使用于存放恢复的数据
[root@gaosh63 ~]# cd test/

首先我们要通过inode结点找到被删除的文件名:

[root@gaosh63 test]# extundelete /dev/sdb1  --inode 2
.                                                2
lost+found                                        11
passwd                                            12             Deleted
hosts                                             13             Deleted
a                                                 7313           Deleted

然后我们开始恢复:

方法1:通过inode结点恢复
[root@gaosh63 test]# extundelete /dev/sdb1 --restore-inode 12
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 9 groups loaded.
Loading journal descriptors ... 63 descriptors loaded.
[root@gaosh63 test]# ls
RECOVERED_FILES

查看是否与源文件一样:

[root@gaosh63 test]# diff /etc/passwd RECOVERED_FILES/file.12  # 没有任何输出,说明 恢复成功,只是文件名不一样

方法2:通过文件名恢复
[root@gaosh63 test]# extundelete /dev/sdb1 --restore-file passwd
[root@gaosh63 test]# diff /etc/passwd RECOVERED_FILES/passwd  # 没有任何输出,说明一样,这次文件名也一样了
方法3:恢复某个目录,如目录a下的所有文件:

[

root@gaosh63 test]# extundelete /dev/sdb1 --restore-directory a
[root@localhost ~]# tree RECOVERED_FILES/
RECOVERED_FILES/
├── a
│   ├── a.txt
│   └── b
│       └── a.txt
├── file.12
└── hosts

下面是原来的目录结构:

├── a.txt
└── b├── a.txt├── c
└── kong.tx

由上图可见空文件是无法恢复的。

方法4:恢复所有的文件
[root@gaosh63 test]# extundelete /dev/sdb1 --restore-all

总结:备份数据是王道

当数据被误删(一般指的是物理文件损坏或者rm导致的误删)造成数据丢失,你会如何处理?

  • 如果有备份,可以通过mysqldump+binlog来实现全量恢复,xtrabackup来实现增量恢复
  • 没有备份但是做了主从同步,或者双主结构,可以把从库提升为主库来恢复数据
  • 如果你们公司没有备份,也没有从库,可以通过extundelete来恢复数据。

切记:任何补救措施都是事故,并不会显得有多高大上,高大上的运维应该是做好线上线下运维规范,确保不出现运维事故。

学会这个骚操作,再也不怕从删库到跑路相关推荐

  1. mysqldump全量恢复_删库不跑路-详解MySQL数据恢复

    日常工作中,总会有因手抖.写错条件.写错表名.错连生产库造成的误删库表和数据的事情发生,那么,如果连数据都恢复不了,还要什么 DBA. 相关文章 MySQL备份策略:https://segmentfa ...

  2. MySQL从删库到跑路(5):in and not

     "哈哈哈哈,看你这几天没来上课,我还以为你去拜什么高人为师了?原来就是这个烂番薯.臭鸟蛋的小卖部大爷学装逼,你逗我玩呢?哈哈哈哈哈"  "哈哈哈哈,一个老屌丝,一个小屌 ...

  3. 手误【删库】 == 跑路,不存在的 ——删瓦辛格

    手误[删库] ==  跑路,不存在的  --删瓦辛格 前言 今天公司服务器的宝塔打不开,让我去修(ps:宝宝委屈) 打开找一下问题所在 问题: 发现是宝塔官方的cdn好像挂掉了 解决思路: (1)本地 ...

  4. mysql高级-15-数据库备份与恢复(删库不跑路)

    mysql高级 前言 1.物理备份与逻辑备份 2.mysqldump实现逻辑备份 2.1 备份一个数据库 2.2 备份全部数据库 2.3 备份部分数据库 2.4 备份部分表 2.5 备份单表的部分数据 ...

  5. MySQL从删库到跑路(2):大爷的SQL私房菜

    大爷的SQL私房菜 夜色如墨,月凉如水,一轮皎洁的圆月高高地挂在夜空之上,平日里鼾声如雷的室友今夜也停止了打鼾,如此静谧的夜晚,李有为却辗转难眠. 时间悄然来到凌晨一点半,他已经在窗边站了53分钟23 ...

  6. 告别从删库到跑路,linux回收站实现

    在linux 下操作时经常需要用到rm -rf,一招不慎轻者从删库到跑路,重者到跑路机会都没有.趁放假,试着结合实际生产环境,实现一下之前一直想的win回收站机制 实现思路 alias 给rm取别名, ...

  7. 从删库到跑路,就是这么迅速!程序员为了报复同事删了公司数据库

    从删库到跑路,就是这么迅速!程序员为了报复同事删了公司数据库 一只有头发的程序猿 2019-08-23 09:38 做过互联网行业的都知道,数据库对公司是至关重要的,存储了大量的数据在里面,要是没有这 ...

  8. Linux 下谨慎使用 rm,避免从删库到跑路的悲剧发生

    我们该如何再次避免删库"跑路"等事件的再次发生? 对此,在企业首先做好权限管理以及多重审核机制的同时,CSDN 也曾教诸多程序员们如何在 Linux 下谨慎使用 rm,避免从删库到 ...

  9. 删库不跑路,MySQL 数据库恢复教程

    在工作中,我们误删数据或者数据库,我们一定需要跑路吗?我看未必,程序员一定要学会自救,神不知鬼不觉的将数据找回. 在 MySQL 数据库中,我们知道 binlog 日志记录了我们对数据库的所有操作,所 ...

最新文章

  1. P4755 Beautiful Pair (数据结构+分治)
  2. 四年磨一剑,机械出身的我是如何拿到蚂蚁金服 Offer 的!
  3. 关于Ping的TTL的含义
  4. setdata改数组里的值 微信小程序_今日艰难笔记redux小程序随记
  5. 配置mysql 问题解决
  6. 机械制图中外螺纹的画法_机械制图基础常识42条,条条都是经典!
  7. SAP物料主数据随笔
  8. yii2 html form,YII2中ajax通过post提交form表单数据报400错误的解决方法
  9. 子页面赋值给父页面的控件方法
  10. STM32F072单片机的低功耗实验/STOP模式低功耗调试
  11. oracle本地数据库登录之连接pdb数据库
  12. 请求服务器获取微信openid,Golang通过小程序获取微信openid的方法示例
  13. eNSP下的vlan划分实验
  14. 激光雷达进入「规模化」上车周期?最大变数是什么?
  15. flutter 语音转文字(科大讯飞)
  16. matlab日常(2)
  17. mongoDB常用查询更新删除语句
  18. BES蓝牙耳机进入待机状态设计
  19. (10.2.3.3)静电的设计教室:APP设计利器Sketch教程(03)-让插件助你一臂之力(原创
  20. 【单片机基础】ADC0832详解

热门文章

  1. Android记事本案例
  2. 关于BIEE的Answer中使用unin。
  3. 中国软件业的现状浅析
  4. 横河EJA210E-JHS5J-910DN-EH23B2WE03-B变送器
  5. jvm疯狂吞占内存,罪魁祸首是谁
  6. python 标签_python3生成标签云
  7. Nginx图片缩略图
  8. centos7网卡不能重启
  9. 语音测试软件 呼+未,PA+MATE7 中国移动VoLTE测试工具使用v1_20160115
  10. VA、RVA、FOA