除了system表空间的数据文件(mount)之外,其它数据文件可以在open(mount也可以)状态下恢复。open状态下恢复数据文件可以减少数据库停用的时间,所以应该在open状态下恢复这些数据文件。
示例一:数据文件被误删除
数据库关闭状态下删除非系统表空间数据文件。
启动数据库到mount状态。
脱机丢失的数据文件,alter database datafile n offline。
打开数据库,alter database open。
转储数据文件,restore datafile n。
使用recover datafile n 应用归档日志。
联机数据文件,alter database datafile n online。
--数据库关闭状态下删除非系统表空间数据文件。
1. [oracle@localhost ~]$ rm $ORACLE_BASE/product/10.2.0/oradatabak/example01.dbf;
2. SQL> select file#,error from v$recover_file;
3. FILE# ERROR
4. ---------- -----------------------------------------------------------------
5. 5 FILE NOT FOUND
6. SQL> select file#,name from v$datafile where file#=5;
7. FILE# NAME
8. ---------- --------------------------------------------------------------------------------
9. 5 /oracle/10g/oracle/product/10.2.0/oradatabak/example01.dbf
10. --恢复数据文件
11. RMAN> run {
12. startup force mount;
13. sql 'alter database datafile 5 offline';
14. sql 'alter database open';
15. restore datafile 5;
16. recover datafile 5;
17. sql 'alter database datafile 5 online';
18. 8> }
示例二:数据文件所在磁盘出现损坏
数据库关闭状态下删除非系统表空间数据文件。
启动数据库到mount状态。
脱机丢失的数据文件,alter database datafile n offline。
打开数据库,alter database open。
在restore database之前,执行set newname为数据文件指定新的位置。
在restore database之后,执行switch datafile改变控制文件中数据文件位置和名称。
之后通过执行recover database应用归档日志。
联机数据文件,alter database datafile n online。
--数据库关闭状态下删除非系统表空间数据文件。
1. [oracle@localhost ~]$ rm $ORACLE_BASE/product/10.2.0/oradatabak/example01.dbf;
2.
3. SQL> select file#,error from v$recover_file;
4.
5. FILE# ERROR
6.
7. ---------- -----------------------------------------------------------------
8.
9. 5 FILE NOT FOUND
10.
11. SQL> select file#,name from v$datafile where file#=5;
12.
13. FILE# NAME
14.
15. ---------- --------------------------------------------------------------------------------
16.
17. 5 /oracle/10g/oracle/product/10.2.0/oradatabak/example01.dbf
18.
19. --恢复数据文件
20.
21. [oracle@localhost ~]$ rman target sys/oracle@oralife nocatalog
22.
23. RMAN> run {
24.
25. 2> startup force mount;
26.
27. 3> sql 'alter database datafile 5 offline';
28.
29. 4> sql 'alter database open';
30.
31. 5> set newname for datafile 5 to '$ORACLE_BASE/product/10.2.0/oradata/oralife/example01.dbf';
32.
33. 6> restore datafile 5;
34.
35. 7> switch datafile 5;
36.
37. 8> recover datafile 5;
38.
39. 9> sql 'alter database datafile 5 online';
40.
41. 10> }
42.
43. SQL> select file#,name from v$datafile where file#=5;
44.
45. FILE# NAME
46.
47. ---------- --------------------------------------------------------------------------------
48.
49. 5 /oracle/10g/oracle/product/10.2.0/oradata/oralife/example01.dbf
50.
51. SQL> select file#,error from v$recover_file;
52.
53. no rows selected