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 误删除的文件?相关推荐

  1. 如何恢复rm -rf后的文件(ext4)

    如何恢复rm -rf后的文件(ext4) 本文档给出了恢复ext4文件系统被误删的文件的方法,需要使用的软件是extundelete,这款软件对ext4文件系统的恢复成功率比较高,值得拥有! 恢复ex ...

  2. linux恢复rm删除文件ssd,科学网—linux恢复rm -rf删除的文件 - 罗晓光的博文

    ext3grep这个软件可以恢复linux ext3分区下rm -rf删除的文件,以下是部分存档操作记录(不全),仅供参考 1-step Writing analysis so far to 'sda ...

  3. 通过lsof命令恢复rm -rf 误删的文件

    针对rm -rf 删除的且在lsof能够看到的情况下 当误删了重要数据时,可以通过lsof |grep deleted命令查询出 user 18940 19112 polkitd 4u REG 0,3 ...

  4. Linux中如何恢复rm命令误删除的文件之extundelete编译安装及使用

    1.下载extundelete包,安装依赖 我用的是Centos系统,在安装extundelete之前需要安装e2fsprogs,e2fsprogs-libs,e2fsprogs-devel. yum ...

  5. rm rf 后的文件如何恢复

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 原贴:h ...

  6. extundelete工具恢复rm -rf 删除的目录(ext4、ext3)

    extundelete工具恢复rm -rf 删除的目录(ext4) ext3grep工具只能用于恢复ext3文件系统下删除的文件,对于ext4文件系统,可以使用extundelete工具.使用的方法类 ...

  7. Linux/Ubuntu: 使用 trash-cli 防止 rm 命令误删除重要文件

    曾几何时,一条 rm -rf /useless /* 命令干掉了我们需要的文件,也干掉的整个系统, 这是是不是与哭无泪啊. 像这种使用 rm 命令误删除文件的情况,我们会注意,但是我们不能保证百分百的 ...

  8. linux的垃圾箱是哪个文件夹,Ubuntu命令行的垃圾箱Trash CLI,远离 rm 命令误删除重要文件的阴影...

    原标题:Ubuntu命令行的垃圾箱Trash CLI,远离 rm 命令误删除重要文件的阴影 作为Linux用户,您可能需要不时从系统中删除文件.我们在删除文件时往往会保持谨慎,特别是在永久删除文件时, ...

  9. rm -rf 误删除数据如何进行恢复

    不过是在工作或者学习中,我们都经常又可以触及到一个非常危险的命令rm -rf,这个命令会直接删除数据,并且不需要我们确认,所以说使用的时候要注意. 那么,如果我们一不小心删除了数据该怎么办呢? 首先, ...

最新文章

  1. 编程小问题系列(2)——为什么WPF里MediaElement等视频控件不起作用
  2. 苹果手机如何恢复联系人呢?快速的恢复
  3. QueryList的使用
  4. Python学习入门基础教程(learning Python)--2.3.5Python返回多个值问题
  5. KitKat系统发现BUG:付费输入法更新后自动停用
  6. spring 整合quartz
  7. Mvc前后端显示不同的404错误页
  8. 直接内存访问 (Direct Memory Access, DMA)
  9. gradle-学习笔记(2)-多项目构建
  10. poj 3280 区间dp
  11. Tomcat报错:ERROR:transport error 202: gethostbyname: unknown host
  12. web(vue) 简单使用 mixpanel 网页埋点
  13. php 问卷调查,php 问卷调查结果统计
  14. 手把手学STM32(一)
  15. adb脚本选择语句_常用adb命令汇总(绝对干货)
  16. linux 实验感悟_linux实训心得_linux实习心得体会范文
  17. python from __future__ import
  18. 无线AP与AC以及STA的区别
  19. Linux十大桌面环境
  20. 项目管理探究之挣值管理常见计算

热门文章

  1. Gitlab启用 LDAP 并分组管理
  2. python用matplotlib 用matshow()绘制矩阵,绘制矩阵图
  3. MATLAB车道偏离检测,车道线检测
  4. Java并发-JMM内存模型
  5. linux mysql 10061_详解使用navicat连接远程linux mysql数据库出现10061未知故障
  6. 人工智能数据--将数据分类并可视化显示。
  7. Customizable constraint systems for succinct arguments学习笔记(2)
  8. 通过基本多边形编辑器编辑头盔
  9. RK3588实战:调用npu加速,yolov5识别图像、ffmpeg发送到rtmp服务器
  10. 推荐近乎免费的调试神器——OzCode