如何抢救恢复 rm

您所在的位置:网站首页 360恢复删除的文件收费吗 如何抢救恢复 rm

如何抢救恢复 rm

2024-07-06 08:45| 来源: 网络整理| 查看: 265

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.dbf rm -rf test.dbf ls 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 dbw0 oracle    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/fd ls -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) /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_ols lsof -p 3317 |grep deleted COMMAND 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.dbf cd /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.dbf      2 /data/oradata/ocrl/datafile/sysaux01.dbf      3 /data/oradata/ocrl/datafile/undotbs01.dbf 4 /data/oradata/ocrl/datafile/users01.dbf      5 /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博客



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3