如果数据库在noarchivelog模式下,我们将从完全的脱机备份中恢复这个数据库,并且不可能实现时间点恢复。

1、还原的准备工作

如果在noarchivelog 模式中运行数据库并且假定拥有数据库的一个备份,就可以非常容易地执行数据库的完全恢复。 首先要清理所有的数据文件,以及旧的重做日志和控制文件。 虽然不是一定要这么做,但由于使用了noarchivelog模式,我们希望一切从头开始。

清理完数据文件,控制文件和重做日志后,就可以开始启动恢复进程。 首先,可以从最近生成的备份中恢复控制文件,或者可以使用在某个时间点(备份完成后的时间内)创建的备份控制文件。 如果使用create control file命令,就需要在还原数据库之前把与RMAN 备份相关的文件编程目录。

如果恢复了服务器参数文件和控制文件,就可以忽视使用恢复目录和不使用恢复目录之间的差异。 因此,我们只介绍不使用恢复目录的恢复操作。 此外,使用FRA 和不使用FRA的恢复操作也没有很大区别。

恢复操作的RMAN 命令如下:

Startup mount;

Restore database;

Recover database noredo; -- 如果联机日志存在,可以用recover database代替

Alter database open resetlogs;

这里假定已经恢复了服务器参数文件和数据库控制文件。 第一条命令startup mount 加载数据库,因此Orace 会读取准备用于数据库还原操作的控制文件。 第二条命令restore database将使RMAN 启动数据库的还原操作。 第三条命令指示RMAN执行最后的恢复操作以准备打开这个数据库。  由于是noarchivelog 模式,并且不应用任何归档的重做日志并且丢失了联机重做日志,所以在这条命令中使用noredo 参数。 如果存在完整的联机重做日志,就不需要使用noredo 参数。 最后,使用alter database open resetlogs 命令打开这个数据库。 由于已经还原了控制文件,并且需要重新构建联机重做日志,所以必须使用resetlogs 命令。

Resetlogs 表示一个数据库逻辑生命周期的结束与另一个逻辑生命周期的开始,使用resetlogs后,SCN不会被重置,但是会重置日志序列号,重置redo log。 以防止不完全恢复后日志序列发生冲突。


2、从旧备份中还原数据库

有事,我们可能需要还原多个备份,并且想要从最新备份之外的某些备份中恢复数据库。 在这种情况下,需要使用set命令和其他还原进程。 下面是实现比默认备份更早的备份中还原数据库:

Startup mount;

Run

{

Set until time "to_date('2010-6-28 17:04:00','yyyy-mm-dd hh24:mi:ss')";

Restore database;

Recover database noredo;

Alter database open resetlogs;

}

这里的set until time 命令被限定在run 代码块中。 如果要使用set until time命令,就必须满足这个要求。 我们设定的时间是2010-6-28 17:04:00,Oracle会查找最接近但是不会超过这个设置值的时间生成备份。 如果说在6-28日生成了3个备份。 分别是8点,18点,22点。 那么RMAN 会选择18点的备份。

如果不使用run 代码块,就必须在restore 命令中设置时间限制:

Startup mount;

Restore database until time "to_date('2010-6-28 17:04:00','yyyy-mm-dd hh24:mi:ss')";

Recover database noredo;

Alter database open resetlogs;


3、在不同的位置上还原数据库

我们并不是总是希望将数据库还原到Oracle文件的原始文件位置。 例如,在一个灾难恢复练习中,我们可以将数据库恢复到一个大的文件系统中。

RMAN 默认将数据文件还原到备份时数据文件所在的原始位置。如果想更换位置,输入set newname for datafile 和switch命令即可。 如:

Set newname for datafile 'D:/app/Administrator/oradata/orcl/dave01.dbf' to 'E:/app/Administrator/oradata/orcl';

这里定义的是数据文件的原始位置和RMAN应当将文件复制到新的位置。 一旦对所有要还原到不同位置的数据文件都执行了set newname for datafile命令,就可以使用restore 和 recover 命令。 最后,在打开数据库之前,必须告诉Oracle以后永久的使用已还原,重定位的数据文件。 这里我们使用swithch命令就可以。

Switch 命令可以修改数据库控制文件中数据文件的位置,以反映Oracle数据库文件新的位置。 通常,使用switch datafile all命令,可以知识Oracle 转换控制文件中所有数据文件位置。 此外switch datafile命令也可以转换特定数据文件的位置。

如果使用set newname for datafile命令但不转换所有还原的数据文件,RMAN 就会将没有转换的数据文件当作数据文件的副本,并且在恢复数据库时RMAN不会尝试使用这些没有转换的数据文件。 示例如:

Startup nomount;

Restore controlfile from autobackup;

Alter database mount;

Run

{

Set newname for datafile 'D:/app/Administrator/oradata/orcl/dave01.dbf' to 'E:/app/Administrator/oradata/orcl/dave01.dbf';

Set newname for datafile 'D:/app/Administrator/oradata/orcl/user01.dbf' to 'E:/app/Administrator/oradata/orcl/user01.dbf';

Restore database;

Recover database noredo;

Alter database open restlogs;

Switch datafile all;  -- 修改控制文件中数据文件位置

}

注意的是,如果恢复操作不成功,但是却成功的还原了数据文件,那么还原的数据文件就会成为数据文件副本,并且不会被删除。


oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html