如何抢救恢复 rm -rf 误删除的文件?
Linux中有一种可怕的误操作 —— rm -rf 误删除文件。对于数据库而言,如果误删除了数据文件,而数据库进程还没挂掉的话,可以尝试抢救一下。注意误rm后千万不要去重启数据库。对于其他文件,下面方法也是适用的,也要注意千万不要去重启相关进程。
一、 误删除用户数据文件模拟
高危操作,没事千万不要在生产环境执行。
SQL> select name from v$datafile;NAME
--------------------------------------------------------------------------------
/data/oradata/ocrl/datafile/system01.dbf
/data/oradata/ocrl/datafile/sysaux01.dbf
/data/oradata/ocrl/datafile/undotbs01.dbf
/data/oradata/ocrl/datafile/users01.dbf
/data/oradata/ocrl/datafile/test.dbf
cd /data/oradata/ocrl/datafile/ls
sysaux01.dbf system01.dbf test.dbf undotbs01.dbf users01.dbfrm -rf test.dbfls
sysaux01.dbf system01.dbf undotbs01.dbf users01.dbf
尝试在test表空间中创建表,开始报错
SQL> create table t tablespace test as select * from dual;
create table t tablespace test as select * from dual*
ERROR at line 1:
ORA-01116: error in opening database file 5
ORA-01110: data file 5: '/data/oradata/ocrl/datafile/test.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
如果发现了误操作,千万先冷静,千万别想着先重启试试,重启雪上加霜。
二、 通过进程打开的文件句柄进行恢复
恢复的原理是,在Linux中,如果文件从操作系统级别被rm掉,之前打开该文件的进程仍然持有相应的文件句柄,所指向的文件仍然可以读写,并且该文件的文件描述符可以从/proc目录中获得。但是要注意的是,此时如果关闭数据库,则此句柄会消失,那么除了扫描磁盘进行文件恢复之外就没有其它方法了。因此在数据库出现问题的时候,如果不确认情况的复杂程度,千万不要随便关闭数据库。重启数据库往往是没有意义的,甚至是致命的。
1. 检查dbwr的进程PID
ps -ef|grep dbw0oracle 6121 1 0 Feb07 ? 00:00:32 ora_dbw0_ocrl
oracle 19015 18603 0 11:52 pts/1 00:00:00 grep dbw0
2. 检查dbwr打开的所有文件句柄
dbwr会打开所有数据文件的句柄,在/proc目录中可以查到,目录是进程PID,fd表示文件描述符。
cd /proc/6121/fdls -l
#输出
lr-x------ 1 oracle dba 64 Feb 7 10:11 0 -> /dev/null
l-wx------ 1 oracle dba 64 Feb 7 10:11 1 -> /dev/null
l-wx------ 1 oracle dba 64 Feb 7 10:11 2 -> /dev/null
lrwx------ 1 oracle dba 64 Feb 7 10:11 256 -> /data/oradata/ocrl/control/control01.ctl
lrwx------ 1 oracle dba 64 Feb 7 10:11 257 -> /data/oradata/ocrl/control/control02.ctl
lrwx------ 1 oracle dba 64 Feb 10 11:42 258 -> /data/oradata/ocrl/datafile/system01.dbf
lrwx------ 1 oracle dba 64 Feb 10 11:42 259 -> /data/oradata/ocrl/datafile/sysaux01.dbf
lrwx------ 1 oracle dba 64 Feb 10 11:42 260 -> /data/oradata/ocrl/datafile/undotbs01.dbf
lrwx------ 1 oracle dba 64 Feb 10 11:42 261 -> /data/oradata/ocrl/datafile/users01.dbf
lrwx------ 1 oracle dba 64 Feb 10 11:42 262 -> /data/oradata/ocrl/datafile/test.dbf (deleted) <-------- 注意这个
lrwx------ 1 oracle dba 64 Feb 10 11:42 263 -> /data/oradata/ocrl/tempfile/temp01.dbf
lr-x------ 1 oracle dba 64 Feb 7 10:11 3 -> /dev/null
lr-x------ 1 oracle dba 64 Feb 7 10:11 4 -> /u01/app/oracle/product/12.1.0/db_1/rdbms/mesg/oraus.msb
lr-x------ 1 oracle dba 64 Feb 7 10:11 5 -> /proc/6121/fd
lrwx------ 1 oracle dba 64 Feb 7 10:11 6 -> /u01/app/oracle/product/12.1.0/db_1/dbs/hc_ocrl.dat
l-wx------ 1 oracle dba 64 Feb 7 10:11 7 -> /u01/app/oracle/product/12.1.0/db_1/rdbms/mesg/oraus.msb
lrwx------ 1 oracle dba 64 Feb 7 10:11 9 -> /u01/app/oracle/product/12.1.0/db_1/dbs/lkOCRL
注意其中 /data/oradata/ocrl/datafile/test.dbf (deleted) 字样,表示该文件已经被删除
有一个比较简单的找法是利用 lsof 命令
lsof -p dbw进程pid |grep deleted
例如
ps -ef|grep dbw
oracle 3317 1 0 Jul26 ? 00:01:04 ora_dbw0_olslsof -p 3317 |grep deletedCOMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ora_dbw0_ 3317 oracle 259uW REG 254,0 5451030528 1979159 /home/oracle/data/OLS_DATA.dbf (deleted)
ora_dbw0_ 3317 oracle 262uW REG 254,0 536879104 1979158 /home/oracle/data/OLS_IDX.dbf (deleted)
3. 将该句柄文件名复制回原位置
cp 262 /data/oradata/ocrl/datafile/test.dbfcd /data/oradata/ocrl/datafile/ls
sysaux01.dbf system01.dbf test.dbf undotbs01.dbf users01.dbf
4. 进行数据文件recover
SQL> alter database datafile 5 offline;
Database altered.SQL> recover datafile 5;
Media recovery complete.SQL> alter database datafile 5 online;
Database altered.SQL> select file#,name from v$datafile;FILE# NAME
----------- ---------------------------------------------------------------------1 /data/oradata/ocrl/datafile/system01.dbf2 /data/oradata/ocrl/datafile/sysaux01.dbf3 /data/oradata/ocrl/datafile/undotbs01.dbf4 /data/oradata/ocrl/datafile/users01.dbf5 /data/oradata/ocrl/datafile/test.dbf
测试建表
SQL> create table t tablespace test as select * from dual;
Table created.SQL> select * from t;D
-
X
至此完成数据文件恢复
参考
Oracle linux下 rm 数据文件恢复测试详解_雨丶花丶石的博客-CSDN博客
linux平台通过lsof命令恢复被误删的oracle数据文件_killvoon的博客-CSDN博客
linux lsof详解_guoguo1980的博客-CSDN博客
如何抢救恢复 rm -rf 误删除的文件?相关推荐
- 如何恢复rm -rf后的文件(ext4)
如何恢复rm -rf后的文件(ext4) 本文档给出了恢复ext4文件系统被误删的文件的方法,需要使用的软件是extundelete,这款软件对ext4文件系统的恢复成功率比较高,值得拥有! 恢复ex ...
- linux恢复rm删除文件ssd,科学网—linux恢复rm -rf删除的文件 - 罗晓光的博文
ext3grep这个软件可以恢复linux ext3分区下rm -rf删除的文件,以下是部分存档操作记录(不全),仅供参考 1-step Writing analysis so far to 'sda ...
- 通过lsof命令恢复rm -rf 误删的文件
针对rm -rf 删除的且在lsof能够看到的情况下 当误删了重要数据时,可以通过lsof |grep deleted命令查询出 user 18940 19112 polkitd 4u REG 0,3 ...
- Linux中如何恢复rm命令误删除的文件之extundelete编译安装及使用
1.下载extundelete包,安装依赖 我用的是Centos系统,在安装extundelete之前需要安装e2fsprogs,e2fsprogs-libs,e2fsprogs-devel. yum ...
- rm rf 后的文件如何恢复
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 原贴:h ...
- extundelete工具恢复rm -rf 删除的目录(ext4、ext3)
extundelete工具恢复rm -rf 删除的目录(ext4) ext3grep工具只能用于恢复ext3文件系统下删除的文件,对于ext4文件系统,可以使用extundelete工具.使用的方法类 ...
- Linux/Ubuntu: 使用 trash-cli 防止 rm 命令误删除重要文件
曾几何时,一条 rm -rf /useless /* 命令干掉了我们需要的文件,也干掉的整个系统, 这是是不是与哭无泪啊. 像这种使用 rm 命令误删除文件的情况,我们会注意,但是我们不能保证百分百的 ...
- linux的垃圾箱是哪个文件夹,Ubuntu命令行的垃圾箱Trash CLI,远离 rm 命令误删除重要文件的阴影...
原标题:Ubuntu命令行的垃圾箱Trash CLI,远离 rm 命令误删除重要文件的阴影 作为Linux用户,您可能需要不时从系统中删除文件.我们在删除文件时往往会保持谨慎,特别是在永久删除文件时, ...
- rm -rf 误删除数据如何进行恢复
不过是在工作或者学习中,我们都经常又可以触及到一个非常危险的命令rm -rf,这个命令会直接删除数据,并且不需要我们确认,所以说使用的时候要注意. 那么,如果我们一不小心删除了数据该怎么办呢? 首先, ...
最新文章
- 编程小问题系列(2)——为什么WPF里MediaElement等视频控件不起作用
- 苹果手机如何恢复联系人呢?快速的恢复
- QueryList的使用
- Python学习入门基础教程(learning Python)--2.3.5Python返回多个值问题
- KitKat系统发现BUG:付费输入法更新后自动停用
- spring 整合quartz
- Mvc前后端显示不同的404错误页
- 直接内存访问 (Direct Memory Access, DMA)
- gradle-学习笔记(2)-多项目构建
- poj 3280 区间dp
- Tomcat报错:ERROR:transport error 202: gethostbyname: unknown host
- web(vue) 简单使用 mixpanel 网页埋点
- php 问卷调查,php 问卷调查结果统计
- 手把手学STM32(一)
- adb脚本选择语句_常用adb命令汇总(绝对干货)
- linux 实验感悟_linux实训心得_linux实习心得体会范文
- python from __future__ import
- 无线AP与AC以及STA的区别
- Linux十大桌面环境
- 项目管理探究之挣值管理常见计算
热门文章
- Gitlab启用 LDAP 并分组管理
- python用matplotlib 用matshow()绘制矩阵,绘制矩阵图
- MATLAB车道偏离检测,车道线检测
- Java并发-JMM内存模型
- linux mysql 10061_详解使用navicat连接远程linux mysql数据库出现10061未知故障
- 人工智能数据--将数据分类并可视化显示。
- Customizable constraint systems for succinct arguments学习笔记(2)
- 通过基本多边形编辑器编辑头盔
- RK3588实战:调用npu加速,yolov5识别图像、ffmpeg发送到rtmp服务器
- 推荐近乎免费的调试神器——OzCode