学无止境
分类: Oracle
2013-09-16 15:13:37
恢复分为完全恢复和不完全恢复,不完全恢复需要resetlogs,重置日志序列号。
一、完全恢复
完全恢复要求在线日志里的记录没丢。
1.全库恢复
RMAN> startup nomount;
RMAN> restore database;
RMAN> alter database mount;
RMAN> recover database;
RMAN> alter database open;
2.表空间完全恢复
RMAN> startup mount;
RMAN> restore tablespace ldytbs;
RMAN> recover tablespace ldytbs;
RMAN> alter database open;
3.数据文件完全恢复
RMAN> startup mount;
RMAN> restore datafile 5;
RMAN> recover datafile 5;
RMAN> alter database open;
二、不完全恢复
1.基于时间点的恢复
RMAN> startup mount;
RMAN> run{
2> set until time "to_date('20121108-16:44:00','yyyymmdd-hh24:mi:ss')";
3> restore database;
4> recover database;
5> }
RMAN> alter database open resetlogs;
2.从全备中基于时间点恢复一个表空间
由于基于时间点,在恢复之前,可能需要设置一下环境变量,让rman备份集中的时间显示得更清楚
set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
set NLS_DATE_FORMAT=YYYYMMDD-HH24:MI:SS
如果是异机恢复,或需要变更初始化参数文件,需要确保参数中路径的描述正确且路径有效,如后台dump目录等。
如果需要恢复controlfile,restore controlfile时不要指定时间,直接恢复即可。
例如:
RMAN> run
2> {
3> allocate channel d1 type disk;
4> restore controlfile to 'E:\oracle\oradata\CONTROL01.CTL';
5> release channel d1;}
恢复数据文件,restore时,只需要恢复system表空间、sysaux表空间、undo表空间,以及想要恢复的用户表空间的相关数据文件。
如果需要rename数据文件名称,使用set newname for datafile命令异机switch datafile命令。
恢复到某个时间点使用set until time '时间',其中时间格式需要满足前面设置的NLS_DATE_FORMAT环境变量格式。
recover时跳过其他不需要恢复的表空间。注意,如果有些表空间名称包含关键字,如"TEST",那么需要用引号引起,否则会报错。
RMAN> run
2> {
3> allocate channel d1 type disk;
4> allocate channel d2 type disk;
5> allocate channel d3 type disk;
6> set newname for datafile 1 to 'E:\oracle\oradata\SYSTEM01.DBF';
7> set newname for datafile 2 to 'E:\oracle\oradata\UNDOTBS01.DBF';
8> set newname for datafile 3 to 'E:\oracle\oradata\SYSAUX01.DBF';
9> set newname for datafile 9 to 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\EAGLE01.DBF';
10> set until time '20100827-11:54:54';
11> restore datafile 1,2,3,9;
12> switch datafile 1;
13> switch datafile 2;
14> switch datafile 3;
15> switch datafile 9;
16> recover database skip forever tablespace USERS,LDY,"TEST";
17> release channel d1;
18> release channel d2;
19> release channel d3;
20> }
恢复完之后,需要检查一下redo log和tempfile的名称,是否为有效路径,如果不是,需要rename:
alter database rename file 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\REDO01.LOG' to 'E:\oracle\oradata\REDO01.LOG';
alter database rename file 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\REDO02.LOG' to 'E:\oracle\oradata\REDO02.LOG';
alter database rename file 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\REDO03.LOG' to 'E:\oracle\oradata\REDO03.LOG';
alter database rename file 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\TEMP01.DBF' to 'E:\ORACLE\ORADATA\TEMP01.DBF';
rename之后,就可以用resetlogs方式open了。
alter database open resetlogs;
三、其他恢复
1.恢复spfile
RMAN> restore spfile to 'g:\oracle\backup\1.txt';
2.恢复controlfile
RMAN> run
2> {
3> allocate channel d1 type disk;
4> restore controlfile to 'E:\oracle\oradata\CONTROL01.CTL';
5> release channel d1;}
3.非SYSTEM表空间丢失:
run {
sql 'alter tablespace u1 offline immediate';
Restore tablespace u1;
Recover tablespace u1;
Sql 'alter tablespace u1 online';
}
4.SYSTEM表空间丢失:
run {
Startup mount;
Restore tablespace system;
Recover tablespace system;
Alter database open;
}
5.丢失了其中一个控制文件:
STARTUP NOMOUNT
CP FILE TO NEW
ALTER DATABASE MOUNT
ALTER DATABASE OPEN
6.所有控制文件都丢失:
Startup nomount;
Restore controlfile from autobackup;
Alter database mount;
Recover database;
Alter database open resetlogs;
7.在线日志丢失一个成员:
alter database drop logfile member '/ora/oradata/log1a.log';
alter database add logfile member to group 1
8.所有在线日志都丢失:
startup nomount
restore controlfile from autobackup;
Alter database mount;
restore database;
recover database until cancle using backup controlfile ;
alter database open resetlogs;