名词解释:
顾名思义,完全恢复就是指数据没有丢失的恢复了。不完全恢复是指恢复后有部分数据丢失。它们是数据库的两种恢复方式。
完全恢复:利用重做日志或增量备份将数据块恢复到最接近当前时间的时间点。之所以叫做完整恢复是由于Oracle应用了归档日志和联机重做日志中所有的修改。
不完全恢复:利用备份产生一个非当前版本的数据库。换句话说,恢复过程中不会应用备份产生后生成的所有的重做日志。
通常在下列情况下生成整个数据库的不完整恢复
● 介质失败损坏了几个或全部的联机重做日志文件;
● 用户操作造成的数据丢失,比如,用户误删除了一张表;
● 由于个别归档日志文件的丢失无法进行完整的恢复;
● 丢失了当前的控制文件,必须使用备份的控制文件打开数据库。
为了执行不完整介质恢复,必须使用恢复时间点以前的备份来还原数据文件,并在恢复完成后使用RESETLOG选项打开数据库。
resetlogs参数
在不完全恢复期间,通常需要使用resetlogs命令打开数据库,这是因为我们要从已经建立的现有重做日志流中脱离出来。resetlogs参数表示一个数据库逻辑生存期的结束了另一个数据库逻辑生存期的开始。数据库的逻辑生存期也称为一个对应物(incarnation)。每次使用resetlogs命令时,SCN计数器不会被重置,但是Oracle会重置其他计数器(如日志序列号),同时还会重置联机重做日志的内容。
经过测试,当在非归档模式下尝试执行完全恢复时,发出alter database open 后,RMAN会报如下错误:
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
但是如果加上resetlogs,就不会报错了。而且从恢复的过程来看,期间确实使用在联机日志文档,也就是说它执行的是完全恢复。这说明在非归档模式下执行完全恢复后,打开数据库时也要重置重做日志。其实这也很好想,非归档模式下,没有归档的重作日志,完全恢复时使用联机日志后,这些联机日志文件就没什么用了,因此Oracle就重置日志文件序列号(个人觉得:理论上来说,是可以不重置的,日志文件的序号直接在现有的日志序号上增加,但是这样日志序号会越来越大。Oracle应该是考虑到这一点就在非归档模式下执行完全恢复和不完全恢复时都重置了重做日志)。
完全恢复
完全恢复很简单,不多说,如下:
$ rman target / ##登录rman工具,如果使用了catalog,则登陆方法rman targetsys/Oracle@lscatalogcata/cata@leo
RMAN> startup mount ##必须为mount状态,才能restore 和 recover 数据库
RMAN> restore database; ##复制旧数据文件覆盖损坏的数据文件
RMAN> recover database; ##数据文件头SCN号同步当前日志中最后一个SCN号【完全恢复】
RMAN> alter database open [resetlogs];
![d71e15f47fb92a31b59674670271c9d0.png](https://i-blog.csdnimg.cn/blog_migrate/e0be1e37fdfbd52c2848b42f87f29601.png)
不完全恢复
不完全恢复有一个核心要领需要牢记:不完全恢复影响的是整个数据库,不能只对数据库的一部分执行不完全恢复。不完全恢复使用的方法通常有:基于时间、SCN、日志序列、还原点或基于删除的恢复。
$ rman target /
RMAN> startup mount
RMAN>run
2> {
3> set until time "to_date('07/01/2015 15:00:00', 'mm/dd/yyyy hh24:mi:ss')";
4> restore database;
5> recover database;
6> alter database open;
7> }
从执行过程来看,不完全恢复就是加了一个限制条件,时间/SCN等。如上基于时间点的恢复,Oracle会查找目标恢复时间之前并与恢复时间最近的备份集。如果没有找到可用的备份集,就会报错。