今天尝试了一下,在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>
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
->
/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> alter database datafile 6 offline;
Database altered.
SQL> recover datafile 6;
Media recovery complete.
SQL> 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>
我们可以发现,建立成功了,说明回复成功,