下面进行一个在数据库open的状况下意外删除了数据文件进行恢复的实验
---------- ---------------------------------------------------------------------------
2.在数据库open的状态下直接删除users01.dbf
SQL> host rm /u01/app/oracle/oradata/PROD/users01.dbf
3.尝试在 users 表空间中创建表,开始报错。
SQL> create table test01 tablespace users as select * from dual;
create table test01 tablespace users as select * from dual
*
ERROR at line 1:
ORA-01116: error in opening database file 4
ORA-01110: data file 4: '/u01/app/oracle/oradata/PROD/users01.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
4.查看alert文件。
[oracle@enmoedu trace]$ tail alert_PROD.log
SMCO started with pid=25, OS id=2915
Mon Mar 07 14:26:15 2016
Errors in file /u01/app/oracle/diag/rdbms/prod/PROD/trace/PROD_m000_2928.trc:
ORA-01116: error in opening database file 4
ORA-01110: data file 4: '/u01/app/oracle/oradata/PROD/users01.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
Mon Mar 07 14:26:15 2016
Checker run found 1 new persistent data failures
5. 检查 dbwr 的进程 PID
[oracle@enmoedu trace]$ ps -ef|grep dbw
oracle 2839 1 0 14:16 ? 00:00:00 ora_dbw0_PROD
oracle 3051 2982 0 14:42 pts/1 00:00:00 grep dbw
6. dbwr 会打开所有数据文件的句柄。在 proc 目录中可以查到,目录名是进程 PID,fd 表示文件描述符。
[oracle@enmoedu fd]$ cd /proc/2839/fd
[oracle@enmoedu fd]$ ll
total 0
lr-x------ 1 oracle oinstall 64 Mar 7 14:44 0 -> /dev/null
l-wx------ 1 oracle oinstall 64 Mar 7 14:44 1 -> /dev/null
lrwx------ 1 oracle oinstall 64 Mar 7 14:44 10 -> /u01/app/oracle/product/11.2.0/dbhome_1/dbs/lkPROD
lr-x------ 1 oracle oinstall 64 Mar 7 14:44 11 -> /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/mesg/oraus.msb
l-wx------ 1 oracle oinstall 64 Mar 7 14:44 2 -> /dev/null
lrwx------ 1 oracle oinstall 64 Mar 7 14:44 256 -> /u01/app/oracle/oradata/PROD/control01.ctl
lrwx------ 1 oracle oinstall 64 Mar 7 14:44 257 -> /u01/app/oracle/fast_recovery_area/PROD/control02.ctl
lrwx------ 1 oracle oinstall 64 Mar 7 14:44 258 -> /u01/app/oracle/oradata/PROD/system01.dbf
lrwx------ 1 oracle oinstall 64 Mar 7 14:44 259 -> /u01/app/oracle/oradata/PROD/sysaux01.dbf
lrwx------ 1 oracle oinstall 64 Mar 7 14:44 260 -> /u01/app/oracle/oradata/PROD/undotbs01.dbf
lrwx------ 1 oracle oinstall 64 Mar 7 14:44 261 -> /u01/app/oracle/oradata/PROD/users01.dbf (deleted)
lrwx------ 1 oracle oinstall 64 Mar 7 14:44 262 -> /u01/app/oracle/oradata/PROD/example01.dbf
lrwx------ 1 oracle oinstall 64 Mar 7 14:44 263 -> /u01/app/oracle/oradata/PROD/temp01.dbf
lr-x------ 1 oracle oinstall 64 Mar 7 14:44 3 -> /dev/null
lr-x------ 1 oracle oinstall 64 Mar 7 14:44 4 -> /dev/null
lr-x------ 1 oracle oinstall 64 Mar 7 14:44 5 -> /dev/null
lr-x------ 1 oracle oinstall 64 Mar 7 14:44 6 -> /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/mesg/oraus.msb
lr-x------ 1 oracle oinstall 64 Mar 7 14:44 7 -> /proc/2839/fd
lr-x------ 1 oracle oinstall 64 Mar 7 14:44 8 -> /dev/zero
lrwx------ 1 oracle oinstall 64 Mar 7 14:44 9 -> /u01/app/oracle/product/11.2.0/dbhome_1/dbs/hc_PROD.dat
注意其中/u01/app/oracle/oradata/PROD/users01.dbf (deleted)表示该文件已经被删除
7.cp相对应的文件
[oracle@enmoedu fd]$ cp 261 /u01/app/oracle/oradata/PROD/users01.dbf
8.进行数据文件的recover,至此恢复成功
SQL> recover datafile 4;
Media recovery complete.
SQL> alter database datafile online;
alter database datafile online
SQL> alter database datafile 4 online;
Database altered.
恢复的原理是,在 Linux 操作系统中,如果文件从操作系统级别被rm掉,之前打开该文件的进程仍然持有相应的文件句柄,所指向的文件仍然可以读写,并且该文件的文件描述符可以从 /proc 目录中获得。但是要注意的是,此时如果关闭数据库,则此句柄会消失,那么除了扫描磁盘进行文件恢复之外就没有其它方法了,因此在数据库出现问题的时候,如果不确认情况的复杂程度,千万不要随便关闭数据库。重启数据库往往是没有意义的,甚至是致命的。
参考文章:
http://mp.weixin.qq.com/s__biz=MjM5MzExMTU2OQ==&mid=402451102&idx=1&sn=afd4d395c9f0407f9f3a38c1414e3164&scene=23&srcid=0307ESk1rXJltheSuPorpnC6#rd&ADUIN=188508014&ADSESSION=1457315529&ADTAG=CLIENT.QQ.5467_.0&ADPUBNO=26558