使用RMAN进行恢复

1、使用restore命令

读取备份文件里的数据块,根据数据块所属的数据文件,将这些数据块放回到相应的数据文件里面去,从而完成还原工作

2、使用recover命令

把那些从备份以来生成的归档日志文件以及联机重做日志文件应用到还原出来的数据文件上,从而把数据库从备份的时间点恢复到最新的或者指定的时间点。

完全恢复

1、分为归档和非归档模式,如果目标数据库是非归档模式,那么数据库需要在mount状态进行恢复

2、如果是归档模式,只要不是恢复系统表空间或undo表空间以及控制文件,而是恢复其他数据文件,数据库在打开的状态下就可以进行

如果控制文件和spfile都丢失,那么必须先还原spfile,再还原控制文件

启用了自动备份控制文件,且备份集位于闪回恢复区域

1、每次备份时,都会自动备份控制文件和spfile,并将这两种文件放在同一个备份集中。如果我们失去了spfile,则需要还原该文件,那么实例需要启动到nomount状态,控制文件可以不打开。

2、启动实例时,我们需要借助一个参数文件,该参数文件的内容不要求很完整,只要能够将数据库启动到nomount状态即可。

创建数据库恢复_第1张图片

控制文件和spfile所在的备份集位于闪回恢复区,该区域的文件名是随机生成的,因此,要从其中恢复spfile,必须仔细找到spfile所在的最新备份集。因为没有从控制文件中得到备份信息,因此需要手工的寻找spfile所在备份集的名字。

一般控制文件和spfile都在一个备份集中,而且文件比较小,大都比较小,一般在10M以下。找到备份集以后,执行命令进行恢复。

具体流程就是

1、寻找spfile和控制文件所在的备份集,然后恢复出来。

RMAN> restore spfile to ‘Your spfile path’ from ‘Your spfile backupset path’;

如果没有指定spfile的恢复路径,默认恢复到$ORACLE_HOME/dbs目录中去.

还原控制文件和spfile的步骤都是一样的

1、找到spfile所在的路径

2、找到文件所在的备份集

3、使用命令restore spfile from ‘备份集的路径名称’

4、使用命令restore controlfile from ‘备份集的路径名称’

分为几种情况

1、启用了自动备份控制文件,而且备份集位于闪回恢复区

随便找一个ora文件将数据库启动到nomount状态,因为闪回恢复区的文件名字是数据库自己管理的,因此我们只能尝试着使用每一个备份片,使用restore进行恢复尝试。

2、启用了自动备份控制文件,且备份集位于不同的指定路径中,那么备份集的名字和路径一定是按照我们指定的format参数来命名的。

我们直接可以使用下面的命令进行恢复

获得dbid的方式有两种

1、通过自动备份控制文件的名字获得

2、通过mount数据库以后的select dbid from v$database

将spfile还原出来,然后转换成为pfile

创建数据库恢复_第2张图片

3、没有启用自动备份控制文件

如果没有启用自动备份控制文件,那么每次备份1号数据文件的时候,都会强制备份控制文件和spfile,因此还是需要找到备份片,然后使用restore进行还原。

前面讲了还原数据库的spfile和控制文件的方式方法

非归档模式下面的完全恢复

创建数据库恢复_第3张图片

重启数据库,设置为非归档模式

创建数据库恢复_第4张图片

备份数据库

控制文件、联机重做日志文件、数据文件全都损坏

1、数据库启动到nomount状态,还原控制文件,因为自动备份启动,而且备份未放在闪回恢复区

控制文件里面有这些信息,根据这些信息,我们能够找到数据文件,归档日志文件等备份信息。因此我们需要控制文件备份,即使这些文件备份不是最新的。

2、数据库关闭的情况下删除控制文件、联机重做日志文件、数据文件

将数据库启动到nomount状态

找到BDID

控制文件还原到位。

将数据库进行mount

还原所有的数据

恢复数据库,因为联机重做日志文件丢失。所以使用noredo。

打开数据库,完成恢复。

创建数据库恢复_第5张图片

删除所有文件

clip_image006

启动数据库到nomount状态

创建数据库恢复_第6张图片

查看备份文件

创建数据库恢复_第7张图片

恢复控制文件

创建数据库恢复_第8张图片

加载数据库

clip_image010

还原数据库

clip_image011

介质恢复

clip_image012

重新打开数据库

clip_image013

只有数据文件丢失

省略了spfile和控制文件的寻找恢复。将数据库启动到mount状态,使用restore database和recover database进行恢复即可。

如果自上次备份以来,日志文件进行了切换,但是备份时的current日志文件组始终没有被覆盖。(间隔时间短、联机日志文件大、业务量小等原因)。那么在进行恢复的时候,可以实现无数据丢失。

创建数据库恢复_第9张图片

当前日志组是1

clip_image015

备份users表空间

创建数据库恢复_第10张图片

数据库重新开启,对外提供服务

创建数据库恢复_第11张图片

在上次备份以来,备份时的current日志文件组还没有被覆盖。我们不知道是否被覆盖。假设没有被覆盖。

删除users的数据文件,启动数据库到mount状态。

创建数据库恢复_第12张图片

还原数据库,假设联机日志文件没有被覆盖,还能够配合备份进行数据恢复。

clip_image019

完成介质恢复

clip_image020

打开数据库(11g更智能一些)

clip_image021

注意:(10g环境下需要注意)

如果日志文件被覆盖,那么recover命令会失败。

我们只能进入SQLPLUS中,发出如下的命令。

SQL>RECOVER DATABASE UNTIL CALCEL

直接输入cancel,媒体恢复结束。数据库可以以resetlogs启动。

归档模式下面的完全恢复

前提必须具有自备份以来所有的归档日志,如果缺少归档日志文件或者丢失联机重做日志文件,则只能进行不完全恢复,如果丢失控制文件,则需要创建控制文件或者按照前面讲到的从以前的备份中还原控制文件,显然后者更好一些。

非系统表空间损坏

创建数据库恢复_第13张图片

数据库中在正常的使用。Users表空间损坏。

创建数据库恢复_第14张图片

说明一个问题,run内所有的操作并没有作为一个事务出现。

clip_image024

数据被恢复回来。

如果数据库在关闭的状态下失去数据文件。那么将数据库启动到mount状态。然后执行上面的操作。

如果是数据文件损坏,使用下面的操作。

创建数据库恢复_第15张图片

不完全恢复

1、不完全恢复只能在mount下执行

2、必须使用基于数据库的还原,必须还原所有的数据文件

有三种方式

1、基于时间点的恢复

基于日志序列号的不完全恢复

如果一个日志文件损坏,那么经常使用这种恢复方式,恢复一直进行到损坏的日志文件为止。

基于SCN号,类似于基于时间点的不完全恢复

Oracle提供了一个restore point的概念,可以将restore point理解为某个时间点或者某个SCN号的别名。

我们要进行一个批量的加载,如果加载失败,那么我们需要恢复到加载前的那个状态。就可以使用这个特性。

配置恢复目录

恢复目录是位于数据库里的一个schema,该schema下面包含多个表、视图、以及存储过程。在恢复目录中存放了RMAN的元数据。恢复目录里的数据就是控制文件中记录的RMAN元数据的副本。

使用恢复目录的好处

1、同一个恢复目录中可以存放多个目标数据库的RMAN元数据

2、恢复目录就是一个schema,可以在表中存放很长的时间,不像控制文件只能存放7天的数据

3、我们可以将一些RMAN备份命令作为脚本,存放在恢复目录中

4、应该将恢复目录单独存放在一个数据库里面,不要与产品数据库放在一起,原因很简单。

恢复目录中存在两个程序包:DBMS_RCVMAN和DBMS_RCVCAT

创建恢复目录

1、在恢复目录所在的数据库上创建表空间,该表空间用于存放恢复目录所包含的表

2、创建一个用户,作为恢复目录的所有对象的所有者

3、为该用户赋予相应的权限

4、使用RMAN命令创建恢复目录

5、使用RMAN连接目标数据库和恢复目录数据库,将目标数据库注册到恢复目录中

RMAN使用恢复目录进行备份恢复的过程中,实际上总是先将RMAN的元数据保存一份在控制文件中,然后将控制文件中记录的元数据同步到恢复目录中相应的表中,该同步过程分为部分同步和完全同步

在部分同步中,RMAN读取当前的控制文件,并只把发生变化的数据插入到恢复目录中对应的表里。不会同步数据库物理结构的数据。当发出备份恢复命令时,进行的就是部分同步。

完全同步中,会把控制文件里所有的内容同步更新到恢复目录中,使用下面的命令进行完全恢复同步

RMAN> resync catalog;

我们在修改了数据库的物理结构以后,应该进一步完全同步,从而在恢复中体现出这些变化。

使用恢复目录和使用控制文件一样,使用的命令是相通的,但是在Oracle 10g之前,如果我们完成了不完全恢复,并以resetlogs选项打开目标数据库以后,在使用了恢复目录的情况下,需要发出这个命令

RMAN>reset database;

使用resetlogs打开数据库以后,日志序列号从1开始重新开始计算。

RMAN元数据中,日志序列号每次从1开始,RMAN都认为数据库开始了一个新的生命周期,并会为该新的生命周期指定唯一的数值,该数值也叫做“化身”(incarnation),引入incarnation的目的是为了防止数据库应用resetlogs之后的日志。RMAN恢复时,总是会应用同一个incarnation中的日志。因此在打开数据库以后,要运行上面的语句,然后才能继续使用恢复目录来管理RMAN的备份恢复工作。

Oracle10g以后,其恢复技术发生了变化,已经可以使用resetlogs之前和之后的日志。不再需要发出reset database。

如果恢复目录所在的数据库损坏,则无法访问RMAN元数据,也就无法进行备份恢复工作。因此对恢复目录所在的数据库也要进行备份。

只有在发生了备份恢复以后,恢复目录所在的数据库里的数据才会发生变化,不建议再次对恢复目录启用RMAN备份。

一般建议采用导出(exp)的方式对恢复目录进行逻辑备份。

完成目标数据库的备份恢复以后,将恢复目录导出,生成导出文件。

 

创建恢复目录

创建数据库恢复_第16张图片

创建目录数据库的rman用户

创建数据库恢复_第17张图片

在备份库创建catalog表空间与用户

创建数据库恢复_第18张图片

使用rman创建catalog版本库

创建数据库恢复_第19张图片

注册目标数据库到恢复目录数据库并自动执行同步

创建数据库恢复_第20张图片

做一个全库备份,一切OK。