您的位置:首页 > 数据库 > Oracle

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

2012-05-16 09:39 941 查看
今天尝试了一下,在Linux下删除一个数据文件,然后进行回复。

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

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

下面进行演示:

删除users表空间.


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

1234567891011121314select 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.dbf7 rows selected.SQL> !rm /u01/app/oracle/oradata/prod/disk2/users01.dbf


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

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

1

2

3

4

5

6

7

8

9

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。

123$ ps -ef|grep dbw0|grep -v greporacle 11872 1 0 21:46 ? 00:00:00 ora_dbw0_prodoracle 11951 1 0 21:47 ? 00:00:01 ora_dbw0_oms


4、因为dbwr会打开所有数据文件的句柄。所以可以进入proc目录进行查找,格式为:cd /prod/PID/fd此处,fd为文件描述符。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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

[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:47
26
->
/u01/app/oracle/oradata/prod/disk1/temp01.dbf

lrwx------ 1
oracle
dba
64
May
14
22:47
27
->
/u01/app/oracle/oradata/prod/disk3/lmtemp201.dbf

lrwx------ 1
oracle
dba
64
May
14
22:47
28
->
/u01/app/oracle/oradata/prod/disk4/lmtemp201.dbf

lr-x------ 1
oracle
dba
64
May
14
22:47
29
->
/u01/app/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msb

lr-x------ 1
oracle
dba
64
May
14
22:47
3
->
/dev/null

lr-x------ 1
oracle
dba
64
May
14
22:47
4
->
/dev/null

l-wx------ 1
oracle
dba
64
May
14
22:47
5
->
/u01/app/oracle/admin/udump/prod_ora_11859.trc

l-wx------ 1
oracle
dba
64
May
14
22:47
6
->
/u01/app/oracle/admin/bdump/alert_prod.log

lrwx------ 1
oracle
dba
64
May
14
22:47
7
->
/u01/app/oracle/product/10.2.0/db_1/dbs/hc_prod.dat

l-wx------ 1
oracle
dba
64
May
14
22:47
8
->
/u01/app/oracle/admin/bdump/alert_prod.log

lrwx------ 1
oracle
dba
64
May
14
22:47
9
->
/u01/app/oracle/product/10.2.0/db_1/dbs/lkinstprod
(deleted)

[oracle@prod
fd]$





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


5、进行恢复

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

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

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


6、进入recovery

执行以下SQL命令:

1234567891011SQL> alter database datafile 6 offline;Database altered.SQL> recover datafile 6;Media recovery complete.SQL> alter database datafile 6 online; Database altered.SQL>


至此,回复完成!

7、测试

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

SQL>
create
table
abcd123
tablespace
users
as
select *
from
v$instance;

Table
created.

SQL>
select *
from
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

prod

10.2.0.1.0 16-APR-12
OPEN
NO
1
STARTED

ALLOWED NO ACTIVE PRIMARY_INSTANCE
NORMAL NO

SQL>





我们可以发现,建立成功了,说明回复成功,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: