00:13:17 kiwi@prod> select * from cat;
TABLE_NAME TABLE_TYPE
------------------------------ -----------
TEST TABLE
[root@kiwi prod]# ls
control01.ctl control02.ctl example01.dbf kiwi01.dbf redo01.log redo02.log redo03.log sysaux01.dbf system01.dbf temp01.dbf undotbs01.dbf users01.dbf
[root@kiwi prod]# rm -rf kiwi01.dbf
[root@kiwi prod]# ls
control01.ctl control02.ctl example01.dbf redo01.log redo02.log redo03.log sysaux01.dbf system01.dbf temp01.dbf undotbs01.dbf users01.dbf
00:13:45 kiwi@prod> drop table test purge;
drop table test purge
*
ERROR at line 1:
ORA-01116: error in opening database file 6
ORA-01110: data file 6: '/u02/oradata/prod/kiwi01.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
[00:15:45 root()@kiwi fd]# ll
total 0
lr-x------ 1 oracle oinstall 64 Dec 26 00:15 0 -> /dev/null
l-wx------ 1 oracle oinstall 64 Dec 26 00:15 1 -> /dev/null
lr-x------ 1 oracle oinstall 64 Dec 26 00:15 10 -> /dev/zero
lr-x------ 1 oracle oinstall 64 Dec 26 00:15 11 -> /dev/zero
lrwx------ 1 oracle oinstall 64 Dec 26 00:15 12 -> /u01/app/oracle/product/11.2.0/db/dbs/hc_prod.dat
lr-x------ 1 oracle oinstall 64 Dec 26 00:15 13 -> /u01/app/oracle/product/11.2.0/db/rdbms/mesg/oraus.msb
lr-x------ 1 oracle oinstall 64 Dec 26 00:15 14 -> /proc/7401/fd
lr-x------ 1 oracle oinstall 64 Dec 26 00:15 15 -> /dev/zero
lrwx------ 1 oracle oinstall 64 Dec 26 00:15 16 -> /u01/app/oracle/product/11.2.0/db/dbs/hc_prod.dat
lrwx------ 1 oracle oinstall 64 Dec 26 00:15 17 -> /u01/app/oracle/product/11.2.0/db/dbs/lkPROD
lr-x------ 1 oracle oinstall 64 Dec 26 00:15 18 -> /u01/app/oracle/product/11.2.0/db/rdbms/mesg/oraus.msb
l-wx------ 1 oracle oinstall 64 Dec 26 00:15 2 -> /dev/null
lrwx------ 1 oracle oinstall 64 Dec 26 00:15 256 -> /u02/oradata/prod/control01.ctl
lrwx------ 1 oracle oinstall 64 Dec 26 00:15 257 -> /u02/oradata/prod/control02.ctl
lrwx------ 1 oracle oinstall 64 Dec 26 00:15 258 -> /u02/oradata/prod/system01.dbf
lrwx------ 1 oracle oinstall 64 Dec 26 00:15 259 -> /u02/oradata/prod/sysaux01.dbf
lrwx------ 1 oracle oinstall 64 Dec 26 00:15 260 -> /u02/oradata/prod/undotbs01.dbf
lrwx------ 1 oracle oinstall 64 Dec 26 00:15 261 -> /u02/oradata/prod/users01.dbf
lrwx------ 1 oracle oinstall 64 Dec 26 00:15 262 -> /u02/oradata/prod/example01.dbf
lrwx------ 1 oracle oinstall 64 Dec 26 00:15 263 -> /u02/oradata/prod/kiwi01.dbf (deleted)
lrwx------ 1 oracle oinstall 64 Dec 26 00:15 264 -> /u02/oradata/prod/temp01.dbf
lr-x------ 1 oracle oinstall 64 Dec 26 00:15 3 -> /dev/null
lr-x------ 1 oracle oinstall 64 Dec 26 00:15 4 -> /dev/null
lr-x------ 1 oracle oinstall 64 Dec 26 00:15 5 -> /dev/null
lr-x------ 1 oracle oinstall 64 Dec 26 00:15 6 -> /dev/null
lrwx------ 1 oracle oinstall 64 Dec 26 00:15 7 -> /u01/app/oracle/product/11.2.0/db/dbs/hc_prod.dat
lr-x------ 1 oracle oinstall 64 Dec 26 00:15 8 -> /dev/null
lr-x------ 1 oracle oinstall 64 Dec 26 00:15 9 -> /dev/null
00:14:54 kiwi@prod> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
1088766
1088766
1088766
1088766
1088766
1088766
6 rows selected.
Elapsed: 00:00:00.01
00:17:17 kiwi@prod> select checkpoint_change# from v$datafile;
CHECKPOINT_CHANGE#
------------------
1088766
1088766
1088766
1088766
1088766
1088766
6 rows selected.
23:49:28 kiwi@prod> conn / as sysdba
Connected.
23:49:42 sys@prod>
23:49:42 sys@prod> alter database datafile 6 offline;
Database altered.
Elapsed: 00:00:00.10
23:49:51 sys@prod> recover datafile 6;
Media recovery complete.
23:49:57 sys@prod> alter database datafile 6 online;
至此,完成误删除无备份的恢复
这个是利用操作系统文件描述符的方法来进行数据文件的恢复
在操作系统中,内核利用文件描述符在访问文件。在linux系统中,误删除文件以后,虽然该数据文件已经从操作系统中删除了,但是其文件句柄仍有数据库打开并持有,所以才数据库层面并不会释放其链表信息。因而也就能够从进程的地址信息中,通过复制将其直接恢复:
但我们要注意:
数据的关闭offline都会使其文件句柄被释放 ,文件就很难被找回了