1.归档模式下的不完全恢复
不完全恢复就意味着有数据的丢失。引起不完全恢复的原因有很多,如丢失了联机日志 或某个归档日志。另外如果出现了严重损害数据库的用户错误,比如某用户错误的删除了某 个重要的数据,那么数据库也要恢复到这个错误操作之前。
不完全恢复会影响整个数据库,需要在 MOUNT 状态下进行。在不完全恢复完成之后, 通常需要使用 resetlogs 选项来打开数据库。resetlogs 表示一个数据库逻辑生存期的结束和另一个数据库逻辑生存期的开始。数据库的逻辑生存期也被称为一个对应物(incarnation)。 每次使用 resetlogs 选项来打开数据库后都会创建一个新的数据库对应物,这对于恢复操作 来说非常重要。每次使用 resetlogs 后,SCN计数器不会被重置,但是 Oracle会重置联机日 志序列号,同时还会重置联机重做日志内容。因此执行了 resetlogs 之后,应该立即重新备 份整个数据库,否则恢复起来相当麻烦。 (注:Oracle 10g 中已经可以在 resetlogs 之后不备份数据库,恢复的时候能够穿越 resetlogs)
使用RMAN执行不完全恢复操作时需要完成的一个工作是建立恢复目标。恢复目标是要终止恢复进程的点,可以是时间点、指定的 SCN 或者一个日志序列号。我们可以在run代码中使用 set命令和 until time、until scn、until sequence 参数。
也可以选择在RESTORE 和RECOVER命令中直接使用UNTIL TIME、UNTIL SCN、 或者 UNTIL SEQUENCE 参数,这样就可以避免使用 run 代码。例如;
startup mount;
restore database "to_date('2009/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')"; recover database "to_date('2009/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')";alter database open resetlogs;
2.基于SCN的恢复
如果知道数据库出错前的 SCN,可以将数据库还原到指定 SCN 状态。
$ startup mount;
RMAN> run{
restore database until scn 1317011; ——或者 set until scn 1317011
recover database until scn 1317011;
sql 'alter database open resetlogs';
release channel d1;
}
3.基于时间的恢复
下面使用 set until time 命令为 2009年8月1日下午点的恢复目标:
$ startup mount;
RMAN> run{
set until time "to_date('2005/08/01 13:00:00','yyyy/mm/dd hh24:mi:ss')";
restore database;
recover database;
alter database open resetlogs;
}
执行上面的命令时, RMAN 会查找与恢复目标时间最近、但是不包含恢复目标时间及以后时间的备份集,并且从这个备份中还原数据库。如果数据库非归档模式,那么恢复操作会在备份集的时间点停止;否则 RECOVER 命令会应用恢复目标之前的归档重做日志或需 要的增量备份。
4.基于日志序列的恢复
RMAN 允许用户将数据库恢复到指定的归档重做日志序列号。如果归档的重做日志中 有间隙(某个归档日志文件或备份损坏或丢失) ,使用这种方法就很方便。间隙通常意味 着我们只能将数据库还原到间隙开始的地方。
SQL> startup mount;
RMAN> restore database until sequence 100 thread 1; ——not include 100 RMAN> recover database until sequence 100 thread 1;
SQL> alter database open resetlogs;
RMAN> RUN {
2> SET UNTIL SEQUENCE 120 THREAD 1;
4> RESTORE DATABASE;
5> RECOVER DATABASE; ——recovers through log 119 not include 120
6> ALTER DATABASE OPEN RESESTLOGS;
7> }
5.全库恢复:
$ rman target /
RMAN> startup mount
RMAN> restore database;
RMAN> recover database;
核对用户表:
SQL>select * from user_tables;
阅读(1490) | 评论(0) | 转发(0) |