rm删除了文件除了跑路还能怎么办「建议收藏」

rm删除了文件除了跑路还能怎么办「建议收藏」rm删除了文件除了跑路还能怎么办 [toc] 前言 每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行了误删,然后就要准备跑路了,毕竟人不是机器,更何况机器也有bug,呵呵。…

rm删除了文件除了跑路还能怎么办

前言

每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行了误删,然后就要准备跑路了,毕竟人不是机器,更何况机器也有bug,呵呵。那么如果真的删除了不该删除的文件,比如数据库、日志或执行文件,怎么办呢?

模拟场景

pg_ctl start

$ ll
total 8
-rw------- 1 hgdb565 hgdb565 413 May 21 16:45 postgresql-server_log_21
-rw------- 1 hgdb565 hgdb565 760 May 21 16:45 postgresql-server_log_21.csv

代码100分

删除

误删除数据库日志文件,postgresql-server_log_21.csv

代码100分rm postgresql-server_log_21.csv

$ ll
total 4
-rw------- 1 hgdb565 hgdb565 413 May 21 16:45 postgresql-server_log_21

恢复

1 使用lsof命令查看当前是否有进程打开postgresql-server_log_21.csv文件

$ lsof |grep  postgresql-server_log_21
postgres  2465             hgdb565   10w      REG              253,0       413    201050 /opt/HighGo5.6.5/data/pg_log/postgresql-server_log_21
postgres  2465             hgdb565   11w      REG              253,0       877    201051 /opt/HighGo5.6.5/data/pg_log/postgresql-server_log_21.csv (deleted)

从上面可以看出,当前文件状态为已删除(deleted)

2 查看是否存在恢复数据

代码100分$ cd /proc/2465/fd
$ ll
total 0
lr-x------ 1 hgdb565 hgdb565 64 May 21 16:46 0 -> /dev/null
lrwx------ 1 hgdb565 hgdb565 64 May 21 16:46 1 -> /dev/pts/0
l-wx------ 1 hgdb565 hgdb565 64 May 21 16:46 10 -> /opt/HighGo5.6.5/data/pg_log/postgresql-server_log_21
l-wx------ 1 hgdb565 hgdb565 64 May 21 16:46 11 -> /opt/HighGo5.6.5/data/pg_log/postgresql-server_log_21.csv (deleted)
lr-x------ 1 hgdb565 hgdb565 64 May 21 16:46 12 -> pipe:[30810]
l-wx------ 1 hgdb565 hgdb565 64 May 21 16:46 13 -> pipe:[30810]
lrwx------ 1 hgdb565 hgdb565 64 May 21 16:46 2 -> /dev/pts/0
lrwx------ 1 hgdb565 hgdb565 64 May 21 16:46 3 -> anon_inode:[eventpoll]
lr-x------ 1 hgdb565 hgdb565 64 May 21 16:46 6 -> pipe:[30804]
lr-x------ 1 hgdb565 hgdb565 64 May 21 16:46 8 -> pipe:[30805]

可以看到链接号11对应了被删除的文件
11 -> /opt/HighGo5.6.5/data/pg_log/postgresql-server_log_21.csv (deleted)

注意,/proc/[pid]/fd此目录包含进程打开的所有文件,文件名为文件描述符,目录中每个软连接都会指向进程打开的实际文件。

3 使用I/O重定向恢复文件

cat /proc/2465/fd/11 > /opt/HighGo5.6.5/data/pg_log/postgresql-server_log_21.csv

$ ll /opt/HighGo5.6.5/data/pg_log/
total 8
-rw------- 1 hgdb565 hgdb565  413 May 21 16:45 postgresql-server_log_21
-rw-rw-r-- 1 hgdb565 hgdb565 1321 May 21 17:00 postgresql-server_log_21.csv

原理

在Linux系统中,每个运行中的程序都有一个宿主进程彼此隔离,以/proc/进程号来体现(Linux本质上就是一个文件系统),比如:ls -l /proc/13067 查看进程PID为13067的进程信息;当程序运行时,操作系统会专门开辟一块内存区域,提供给当前进程使用,对于依赖的文件,操作系统会发放一个文件描述符,以便读写文件,当我们执行 rm -f 删除文件时,其实只是删除了文件的目录索引节点,对于文件系统不可见,但是对于打开它的进程依然可见,即仍然可以使用先前发放的文件描述符读写文件,正是利用这样的原理,所以我们可以使用I/O重定向的方式来恢复文件。 如果不小心误删了文件,不要着急,首先使用 lsof 查看打开该文件的进程,然后再使用 cat /proc/进程号/fd/文件描述符 查看恢复数据,最后使用I/O重定向的方式来恢复文件。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/8310.html

(0)
上一篇 2023-03-03
下一篇 2023-03-03

相关推荐

  • mysql学习笔记第三节 事务隔离

    mysql学习笔记第三节 事务隔离事务隔离 事务隔离 事物的特性:ACID 原子性:Atomicity 一致性:consistency 隔离性:isolation 持久性:durability 隔离的利弊 隔离程度越高,效率就越低 标

    2023-04-18
    144
  • MongoDB DBA常用的NoSQL语句 参考学习「建议收藏」

    MongoDB DBA常用的NoSQL语句 参考学习「建议收藏」MongoDB DBA常用的NoSQL语句 查看帮忙命令 > hlep –server级别 > db.help() –db级别 > db. collectionname . help() –集…

    2023-03-28
    177
  • Python字典嵌套: 使用内部字典来组织数据

    Python字典嵌套: 使用内部字典来组织数据Python中有一种非常常用的数据类型——字典(Dictionary),它可以在程序中用来存储和组织数据。字典是由键值对组成的集合,其中每个键都对应一个值。但是有些时候,我们需要在一个字典中存储另外一个字典。这就是字典嵌套。本文将介绍如何使用内部字典来组织数据。

    2024-01-25
    109
  • Python创建文件夹

    Python创建文件夹在Python中,我们可以通过一些简单的代码来创建文件夹。这对于需要在代码中创建目录的开发者来说非常实用。无论是为了组织文件,还是为了存储输出结果,Python创建文件夹都是非常有用的技能。本文将介绍如何在Python中创建文件夹,并且列出一些常见的应用场景。

    2024-08-28
    25
  • 如何配置my.ini文件

    如何配置my.ini文件MySQL是世界上最流行的关系型数据库管理系统之一,其广泛应用于各种大型Web应用和企业应用中。而在使用MySQL时,我们经常需要对my.ini文件进行配置,以达到最佳的性能和安全性。本文将从多个方面详细介绍如何配置my.ini文件。

    2024-06-02
    58
  • Python可变参数详解

    Python可变参数详解在Python编程中,一个函数可以通过接收和处理参数来实现它的功能。函数参数有两种类型,即默认参数和可变参数,在本文中我们将重点解析可变参数。可变参数指在调用函数时,可以传入任意数量的参数,这些参数在函数定义中不需要被明确指定,这个特性使得函数的使用更加灵活。在Python中,可变参数主要有两种类型:*args和**kwargs。

    2024-05-05
    71
  • Python中实数和整数的差异及应用

    Python中实数和整数的差异及应用在计算机科学中,实数和整数是两种最基本的数据类型。

    2024-04-11
    75
  • C语言基础项目:200 行代码实现贪吃蛇!思路+源码详解[通俗易懂]

    C语言基础项目:200 行代码实现贪吃蛇!思路+源码详解[通俗易懂]在标准的C库中函数rand可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX是stdlib.h 中定义的一个整数,它与系统有关。

    2022-12-14
    162

发表回复

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