天天看点

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

今天尝试了一下,在Linux下删除一个数据文件,然后进行回复。

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

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

下面进行演示:

删除users表空间.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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

<a href="http://www.spookzang.net/wp-content/uploads/2012/05/recovery-datafile-1.png"></a>

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

SQL&gt;

create

table

abcd123

tablespace

users

as

select *

from

v$instance;

v$instance

                                                       *

ERROR

at

line

1:

ORA-01116:

error

in

opening

database

file

ORA-01110:

data

6:

'/u01/app/oracle/oradata/prod/disk2/users01.dbf'

ORA-27041:

unable

to

open

Linux

Error:

2:

No

such

or

directory

Additional

information:

<a href="http://www.spookzang.net/wp-content/uploads/2012/05/recovery-datafile-2.png"></a>

通过命令,我们可以看到当前数据库实例的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

<a href="http://www.spookzang.net/wp-content/uploads/2012/05/recovery-datafile-3.png"></a>

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

cd /prod/PID/fd

此处,fd为文件描述符。

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

[oracle@prod

fd]$

cd

/proc/11872/fd

ls

-l

total

lr-x------  1

oracle

dba

64

May

22:47

-&gt;

/dev/null

lrwx------  1

/u01/app/oracle/product/10.2.0/db_1/rdbms/audit/ora_11859.aud

/dev/zero

/u01/app/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msb

/u01/app/oracle/product/10.2.0/db_1/dbs/hc_prod.dat

/u01/app/oracle/product/10.2.0/db_1/dbs/lkPROD

/u01/app/oracle/oradata/prod/disk1/control01.ctl

/u01/app/oracle/oradata/prod/disk2/control02.ctl

/u01/app/oracle/oradata/prod/disk3/control03.ctl

(deleted)

/u01/app/oracle/oradata/prod/disk1/temp01.dbf

/u01/app/oracle/oradata/prod/disk3/lmtemp201.dbf

/u01/app/oracle/oradata/prod/disk4/lmtemp201.dbf

l-wx------  1

/u01/app/oracle/admin/udump/prod_ora_11859.trc

/u01/app/oracle/admin/bdump/alert_prod.log

/u01/app/oracle/product/10.2.0/db_1/dbs/lkinstprod

<a href="http://www.spookzang.net/wp-content/uploads/2012/05/recovery-datafile-4.png"></a>

我们可以清楚的看到 /u01/app/oracle/oradata/prod/disk2/users01.dbf (deleted) 的字样,表示此文件已经被删掉了。

通过cp命令,把语句柄拷贝回原来的位置。

cp 24 /u01/app/oracle/oradata/prod/disk2/users01.dbf

此处的24为其给出的编号。

执行以下SQL命令:

SQL&gt;  alter database datafile 6 offline;

Database altered.

SQL&gt; recover datafile 6;

Media recovery complete.

SQL&gt; alter database datafile 6 online;            

<a href="http://www.spookzang.net/wp-content/uploads/2012/05/recovery-datafile-5.png"></a>

至此,回复完成!

我们重新尝试在users 表空间上建立一个table。

Table

created.

abcd123;

INSTANCE_NUMBER

INSTANCE_NAME

---------------

----------------

HOST_NAME

----------------------------------------------------------------

VERSION          

STARTUP_T

STATUS      

PAR    THREAD#

ARCHIVE LOG_SWITCH_WAIT

-----------------

---------

------------

---

----------

-------

LOGINS    

SHU

DATABASE_STATUS  

INSTANCE_ROLE      ACTIVE_ST

BLO

------------------

              1

prod

10.2.0.1.0        16-APR-12

OPEN        

NO          

STARTED

ALLOWED    NO  ACTIVE            PRIMARY_INSTANCE  

NORMAL    NO

<a href="http://www.spookzang.net/wp-content/uploads/2012/05/recovery-datafile-6.png"></a>

我们可以发现,建立成功了,说明回复成功,