说明:归档模式下,数据库打开状态,使用rman恢复数据文件(非系统文件)至新位置,数据库版本11.2.0.1.0------之前做个全备份
当前的数据文件:
SQL> select FILE_ID,FILE_NAME,TABLESPACE_NAME from dba_data_files order by FILE_ID;
FILE_ID FILE_NAME TABLESPACE_NAME
---------- ---------------------------------------- ------------------------------
1 /u01/oradata/frank/system01.dbf SYSTEM
2 /u01/oradata/frank/sysaux01.dbf SYSAUX
3 /u01/oradata/frank/undotbs01.dbf UNDOTBS1
4 /u01/oradata/frank/users01.dbf USERS ----当前路径
在表空间users下创建一个用户frank,然后创建一张表,并插入数据,如下:
SQL> conn frank/frank
Connected.
SQL> create table test (a int);
Table created.
SQL> insert into test values(1);
1 row created.
SQL> commit;
Commit complete.
SQL> select * from test;
A
----------
1
现在使用rm命令删除数据文件4 '/u01/oradata/frank/users01.dbf',准备将其恢复至新的位置:'/u01/oradata/users01.dbf';
[oracle@frank frank]$ rm users01.dbf
[oracle@frank frank]$ ll
total 1518264
-rw-r----- 1 oracle oinstall 9748480 Jun 11 14:39 control01.ctl
-rw-r----- 1 oracle oinstall 52429312 Jun 11 13:57 redo01.log
-rw-r----- 1 oracle oinstall 52429312 Jun 11 13:57 redo02.log
-rw-r----- 1 oracle oinstall 52429312 Jun 11 14:39 redo03.log
-rw-r----- 1 oracle oinstall 566239232 Jun 11 14:38 sysaux01.dbf
-rw-r----- 1 oracle oinstall 713039872 Jun 11 14:38 system01.dbf
-rw-r----- 1 oracle oinstall 20979712 Jun 11 11:24 temp01.dbf
-rw-r----- 1 oracle oinstall 99622912 Jun 11 14:38 undotbs01.dbf
此时进行一次检查点切换,使oracle尽快发现数据文件丢失:
SQL> alter system checkpoint; (注意版本问题,这里手动切换检查点,可能会导致实例crash)
System altered.
SQL> select * from v$recover_file;
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME
---------- ------- ------- -------------------- ---------- ------------------
4 OFFLINE OFFLINE FILE NOT FOUND 0
此时去查询test表中的数据,确实会报错的:
SQL> select * from test;
select * from test
*
ERROR at line 1:
ORA-00376: file 4 cannot be read at this time
ORA-01110: data file 4: '/u01/oradata/frank/users01.dbf'
使用rman来进行恢复:
基本思路:此时数据库是打开状态,可以进行数据文件级别的恢复,因此要先将异常的数据文件置于offline,使用set newname命令指定新的位置,restore完成数据文件复制之后,用switch datafile命令 来使控制文件中信息保持一致,最后进行recover。
run {
sql 'alter database datafile 4 offline';
set newname for datafile 4 to '/u01/oradata/users01.dbf';
restore datafile 4;
switch datafile 4;
recover datafile 4;
sql 'alter database datafile 4 online';
}
rman恢复运行过程,如无报错,以下内容可跳过
sql statement: alter database datafile 4 offline
executing command: SET NEWNAME
Starting restore at 11-JUN-14
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00004 to /u01/oradata/users01.dbf
channel ORA_DISK_1: reading from backup piece /u01/flash_recovery_area/FRANK/backupset/2014_06_11/o1_mf_nnndf_TAG20140611T112557_9shm2646_.bkp
channel ORA_DISK_1: piece handle=/u01/flash_recovery_area/FRANK/backupset/2014_06_11/o1_mf_nnndf_TAG20140611T112557_9shm2646_.bkp tag=TAG20140611T112557
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 11-JUN-14
datafile 4 switched to datafile copy
input datafile copy RECID=2 STAMP=849971894 file name=/u01/oradata/users01.dbf
Starting recover at 11-JUN-14
using channel ORA_DISK_1
starting media recovery
media recovery complete, elapsed time: 00:00:00
Finished recover at 11-JUN-14
sql statement: alter database datafile 4 online
---------------------------------------------------------------------------------------------------------------
此时再去查询:
SQL> select FILE_ID,FILE_NAME,TABLESPACE_NAME from dba_data_files order by FILE_ID;
FILE_ID FILE_NAME TABLESPACE_NAME
---------- ---------------------------------------- ------------------------------
1 /u01/oradata/frank/system01.dbf SYSTEM
2 /u01/oradata/frank/sysaux01.dbf SYSAUX
3 /u01/oradata/frank/undotbs01.dbf UNDOTBS1
4 /u01/oradata/users01.dbf USERS
路径确实改到新的位置了,再去查询表test中的数据:
数据也在,恢复完成。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29602308/viewspace-1180820/
,如需转载,请注明出处,否则将追究法律责任。