首页
运维教程
Linux基础
系统服务
系统架构
数据库
shell脚本
虚拟化
大数据
DevOps
企业案例
运维开发
python
go语言
运维安全
行业资讯
网络基础
系统安全
运维面试
学习路线
学习方法
面试题库
职场解惑
软件
运维软件
办公软件
书籍资源
技术陪跑营
重要信息
首页 运维教程Linux基础学会这个操作,再也不怕从删库到跑路

学会这个操作,再也不怕从删库到跑路

文章目录
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操作系统文件删除原理

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

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

> 文件存储在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。
> 
> 操作系统读取硬盘的时候,不会一个个扇区的读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)。这种由多个扇区组成的“块”,是文件存取的最小单位。“块”的大小,最常见的是4KB,即连续八个sector组成一个block。
> 
> 文件数据都储存在“块”中,那么很显然,我们还必须找到一个地方储存文件的“元信息”,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
> 
> 我们访问的任何数据,都是先找到inode,然后根据inode去找到相应硬盘的位置。如果没有inode号,就无从找到硬盘上的数据。

这个inode号在哪里呢?

```bash
[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节点号就可以恢复数据,但前提是,数据没有被覆盖掉。
那么问题来了: 误删除文件之后,我们第一时间要做的事情是什么?

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

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

实验思路:

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

1 . 新加硬盘

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 进行分区

[root@gaosh63 /]# fdisk /dev/sdb  #对sdb进行分区

Command (m for help): n   #创建一个新分区
Command action
   e   extended
   p   primary partition (1-4)
#创建一个主分区
Selected partition 1

Last 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来恢复数据。

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

本文链接:http://www.geekyunwei.com/447.html

网友评论comments

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

暂无评论

Copyright © 2021 极客运维 公众号《极客运维之家》
扫二维码
扫二维码
返回顶部