误删Oracle数据文件的恢复方法(一)

2014-11-24 09:47:10 · 作者: · 浏览: 2

环境:数据库在Open的状态,然后rm -rf users.dbf (删除users表空间),最后找回users.dbf文件。

在回复的时候,回复的方法跟数据库的版本关系不大(因为是物理文件),只是跟操作系统有一定的关系,如:Red hat Linux , Solaris Linux 等等。

下面进行演示:

删除users表空间.

1、我们首先进入Sqlplus,然后执行SQL语句:


select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/prod/disk4/system01.dbf
/u01/app/oracle/oradata/prod/disk2/undotbs01.dbf
/u01/app/oracle/oradata/prod/disk5/sysaux01.dbf
/u01/app/oracle/oradata/prod/disk5/bigtbs01.dbf
/u01/app/oracle/oradata/prod/disk5/indx01.dbf
/u01/app/oracle/oradata/prod/disk2/users01.dbf
/u01/app/oracle/oradata/prod/disk3/oltp01.dbf

7 rows selected.

SQL> !rm /u01/app/oracle/oradata/prod/disk2/users01.dbf今天尝试了一下,在Linux下删除一个数据文件,然后进行回复。

\

2、此时,users表空间已经被删除了,我们已经无法在users表空间上建立表了。

尝试在users表空间上建立名字为abcd123的表,已经没法建立了。


SQL> create table abcd123 tablespace users as select * from v$instance;
create table abcd123 tablespace users as select * from v$instance
*
ERROR at line 1:
ORA-01116: error in opening database file 6
ORA-01110: data file 6: '/u01/app/oracle/oradata/prod/disk2/users01.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3

3、确认dbwr进程PID

通过命令,我们可以看到当前数据库实例的dbwr的PID。因为我同一台主机上有两个实例,故有2个。

一个为prod,另一个为oms。


$ ps -ef|grep dbw0|grep -v grep
oracle 11872 1 0 21:46 00:00:00 ora_dbw0_prod
oracle 11951 1 0 21:47 00:00:01 ora_dbw0_oms

\

4、因为dbwr会打开所有数据文件的句柄。所以可以进入proc目录进行查找,格式为:

cd /prod/PID/fd

此处,fd为文件描述符。


[oracle@prod fd]$ cd /proc/11872/fd
[oracle@prod fd]$ ls -l
total 30
lr-x------ 1 oracle dba 64 May 14 22:47 0 -> /dev/null
lr-x------ 1 oracle dba 64 May 14 22:47 1 -> /dev/null
lrwx------ 1 oracle dba 64 May 14 22:47 10 -> /u01/app/oracle/product/10.2.0/db_1/rdbms/audit/ora_11859.aud
lr-x------ 1 oracle dba 64 May 14 22:47 11 -> /dev/zero
lr-x------ 1 oracle dba 64 May 14 22:47 12 -> /dev/zero
lr-x------ 1 oracle dba 64 May 14 22:47 13 -> /u01/app/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msb
lrwx------ 1 oracle dba 64 May 14 22:47 14 -> /u01/app/oracle/product/10.2.0/db_1/dbs/hc_prod.dat
lrwx------ 1 oracle dba 64 May 14 22:47 15 -> /u01/app/oracle/product/10.2.0/db_1/dbs/lkPROD
lrwx------ 1 oracle dba 64 May 14 22:47 16 -> /u01/app/oracle/oradata/prod/disk1/control01.ctl
lrwx------ 1 oracle dba 64 May 14 22:47 17 -> /u01/app/oracle/oradata/prod/disk2/control02.ctl
lrwx------ 1 oracle dba 64 May 14 22:47 18 -> /u01/app/oracle/oradata/prod/disk3/control03.ctl
lrwx------ 1 oracle dba 64 May 14 22:47 19 -> /u01/app/oracle/oradata/prod/disk4/system01.dbf
lr-x------ 1 oracle dba 64 May 14 22:47 2 -> /dev/null
lrwx------ 1 oracle dba 64 May 14 22:47 20 -> /u01/app/oracle/oradata/prod/disk2/undotbs01.dbf
lrwx------ 1 oracle dba 64 May 14 22:47 21 -> /u01/app/oracle/oradata/prod/disk5/sysaux01.dbf
lrwx------ 1 oracle dba 64 May 14 22:47 22 -> /u01/app/oracle/oradata/prod/disk5/bigtbs01.dbf
lrwx------ 1 oracle dba 64 May 14 22:47 23 -> /u01/app/oracle/oradata/prod/disk5/indx01.dbf
lrwx------ 1 oracle dba 64 May 14 22:47 24 -> /u01/app/oracle/oradata/prod/disk2/users01.dbf (deleted)
lrwx------ 1 oracle dba 64 May 14 22:47 25 -> /u01/app/oracle/oradata/prod/disk3/oltp01.dbf
lrwx------ 1 oracle dba 64 May 14 22: