备份恢复4.2——rman恢复基础概念-阿里云开发者社区

开发者社区> 数据库> 正文

备份恢复4.2——rman恢复基础概念

简介: rman恢复与用户管理的备份恢复一样,都分为完全恢复和不完全恢复,都需要工作在archivelog模式下。 rman10g之后只保留了0级和1级备份,1级备份分为:cumulative(累积增量)和differential(差异增量)两种模式,如果不加关键词...

rman恢复与用户管理的备份恢复一样,都分为完全恢复和不完全恢复,都需要工作在archivelog模式下。

rman10g之后只保留了0级和1级备份,1级备份分为:cumulative(累积增量)和differential(差异增量)两种模式,如果不加关键词默认是差异增量备份:

backup incremental level 1 cumulative database(累积增量)

backup incremental level 1 database(差异增量)


连接:

rman

connect target /

@/mydir/lyg.txt

或者:

rman @/mydir/lyg.txt


1、rman转储命令:

当使用rman执行介质恢复时,首先需要用restore命令来完成转储备份文件的,执行restore命令时,rman自动转储最近备份的文件。

restore database : 转储数据库的所有数据文件,当数据库的所有数据文件都出现介质失败,或者执行不完全恢复时,应该使用restore database 命令转储所有数据文件,此命令只能在mount状态下使用。


restore tablespace :用于转储特定表空间的数据文件,如果某个表空间的所有数据文件都出现介质失败,并且数据库处于open阶段,那就应该使用restore tablespace命令。该命令只能在open状态下使用。


restore datafile:转储特定数据文件,该命令既可以在mount状态下,也可以在open状态下使用。


restore controlfile: 该命令用于转储控制文件,当执行基于控制文件的不完全恢复或者将数据库恢复到先前副本状态时,必须转储控制文件,restore controlfile 命令只能在nomount状态下使用。


restore archivelog:转储归档日志,当执行完全恢复和不完全恢复时,都需要应用归档日志。如果归档日志出现介质失败,或者归档日志的映像副本不存在,那么应该使用restore archivelog命令转储归档日志,注意,该命令既可以在mount状态下使用,也可以在open状态下使用。


restore spfile: 转储服务器参数文件。如果服务器参数文件出现介质失败,那么可以使用restore spfile命令进行转储。该命令只能在nomount状态使用。


2、rman恢复命令:

当执行介质恢复时,在转储了数据文件备份之后,需要应用归档日志恢复数据文件,恢复数据文件是使用recover命令来完成的,当执行recover命令时,rman会自动应用自 最近备份以来的所有归档日志。


recover database : 用于恢复数据库所有的数据文件,当使用restore database命令转储了所有的数据文件备份之后,应该使用recover database命令执行恢复,注意该命令只能在mount状态下使用。


recover tablespace: 恢复特定表空间的数据文件,先用restore tablespace命令转储,然后使用recover tablespace执行恢复。注意,该命令只能在open状态下。


recover datafile: 该命令既可以在mount状态下,也可以在open状态下使用。


恢复数据库:

通过查询动态性能视图 v$recover_file可以确定需要恢复的数据文件:

SQL> startup            —— 数据库显示mounted 但是open时出错

SQL> select file#, error from v$recover_file;            ——查询需要恢复的文件,以及出错的原因


示例一 :所有数据文件被误删除:因为所有数据文件全部被误删除,所以可以使用restore database 命令转储所有数据文件,在使用recover database 命令恢复数据库,最后执行 alter database open打开数据库:

C:\> rman target sys/liu123@mynewdb  nocatalog

RMAN> startup force mount

RMAN>run{ restore database;

 recover database;

 sql 'alter database open ';

}


示例二:数据文件所在磁盘出现硬件故障:

需要注意,数据文件此事将不能被转储到其原来的位置,为了恢复数据库,必须将数据文件转储到其他磁盘。在执行restore database 命令之前,通过执行set newname命令可以为数据文件指定新的位置。在执行restore database 命令之后,通过执行switch datafile命令,可以改变控制文件所记载的数据文件位置和名称,在通过执行recover database命令可以应用归档日志。最后用sql语句打开数据库。示例:

RMAN> run{

 startup force mount;

set newname for datafile 1 to 'c:\demo\system01.dbf';

set newname for datafile 2 to 'c:\demo\undotas01.dbf';

set newname for datafile 3 to 'c:\demo\sysaux01.dbf';

set newname for datafile 4 to 'c:\demo\users01.dbf';

set newname for datafile 5 to 'c:\demo\user01.dbf';

set newname for datafile 6 to 'c:\demo\user02.dbf';

restore database;

switch databse;

sql 'alter database open'

}

在恢复并打开数据库之后,执行report schema命令可以查看到数据库新的物理方案

RMAN> report schema;


恢复system表空间的数据文件:

因为system表空间出现介质失败时,数据库不能被打开,所以必须在mount状态下恢复其数据文件。


示例一:system表空间的数据文件被误删除,在装载了数据库之后,先使用restore datafile 命令转储该表空间所对应的数据文件,在使用recover datafile 命令应用归档日志。最后打开数据库。命令:

RMAN> run{

 startup force mount;

 restore datafile 1 ;

recover datafile 1 ;

sql 'alter database open'

}


示例二:system表空间数据文件所在磁盘出现故障,肯定不能转储到原来位置,在restore datafile之前,执行set newname为数据文件指定新的位置。执行完restore datafile之后,通过switch datafile可以应用归档日志,最后打开数据库。示例:

RMAN>  run {

 startup force mount;

set newname for datafile 1 to 'd:\demo\system01.dbf';

restore datafile 1 ;

switch datafle 1;

 recover datafile 1;

sql 'alter database open';

}


在open状态下恢复关闭后意外丢失的数据文件:

除了system 表空间的数据文件之外,其他数据文件都可以使用该方法进行恢复:


示例一:数据文件被误删除:装载数据库之后,先使用sql语句alter database datafile 。。。offline脱机丢失的数据文件,接着alter database open 打开数据库。,再使用restore datafile命令转储数据文件,使用recover datafile 命令应用归档日志。,最后再 alter database datafile 。。online恢复联机、示例:

RMAN > run {

 startup force mount;

 sql ‘ alter database datafile 4 offline’;

 sql 'alter database open';

 restore datafile 4;

 recover dtafile 4;

 sql 'alter database datafile 4 online';

}


示例二:数据文件所在的磁盘出现损坏:

很显然数据文件不能被转储到原来的位置。首先装载数据库,然后alter database datafile 。。 offline 。然后alter database open。 在restore datafile之前,先set newname 命令为数据文件制定新的位置,在执行了restore datafile命令之后,用switch datafile 命令可以改变控制文件所记载的数据文件的位置和名称,在通过recover datafile 命令可以应用归档日志。最后alter database datafile 。。 online联机。示例代码:

RMAN > run{

startup force mount;

sql 'alter databse datafile 4 offline';

sql 'alter database open ';

set newname for datafile 4 to 'd:\demouser01.dbf';

restore datafile 4;

switch datafile 4;

recover datafile 4;

sql 'alter database datafile 4 onlune';

}


在open状态下恢复打开时意外丢失的数据文件:

此时,只有出现介质失败的数据文件不能访问,而不影响其他数据文件,假定在open状态下users01,.dbf出现介质失败。

示例一:数据文件被误删除:先在open状态下alter database datafile 。。offline ,使用restore datafile 命令转储数据文件,再recovert datafile应用归档日志,最后alter database datafile 。。online使数据文件联机:

RMAN>run {

sql 'alter database datafile 4 offline';

restore datafile 4;

recover datafile 4;

sql 'alter database datafile 4 online';

}


示例二:数据文件所在磁盘出现故障:不能讲数据文件转储到原来位置,首先alter database datafile 。。offline 。然后set newname for 命令为数据文件指定新位置。然后restore datafile,再switch datafile 更改控制文件中数据文件的名称和位置。再使用recover datafile应用归档日志。最后alter database datafile 。。online。示例:

RMAN > run {

sql ' alter database datafile 4 offline';

set newname for datafile 4 to 'd:\demo\users01.dbf';

restore datafile 4;

switch datafile 4;

recover datafile 4;

sql 'alter database datafile 4 online';

}


在open状态下恢复未备份的数据文件:

示例一:数据文件被误删除:

注意此时数据文件并没有备份,从10g开始,如果数据文件备份不存在,那么转储数据文件时会自动建立数据文件,建立了数据文件之后,就可以根据归档日志跑日志,一直恢复到删除文件的时间点。示例:

RMAN>run {

 starup force mount;

sql 'alter database datafile 7 offline';

sql 'alter database open';

restore datafile 7;

recover datafile 7;

sql 'alter database datafile 7 online';

}


示例二:数据文件所在磁盘损坏。

RMAN>run{

startup force mount ;

sql 'alter database datafile 7 offline';

sql 'alter database open';

set newname for datafile 7 to 'c:\demo\user04.dbf';

restore datafile 7;

switch datafile 7;

recover datafile 7;

sql 'alter database datafile 7 online';

}



恢复表空间:

示例一:数据库处于open状态下,如果某个表空间所有数据文件出现介质故障,首先要使用alter tablespace 。。offline for recover来脱机表空间。接着使用restore tablespace 。。再revover tablespace应用归档日志,最后alter tablespace 。。online 。示例:

RMAN > run{

 sql ' alter tablespace users offline for recover';

 restore tablespace users;

 recover tablespace users;

 sql ' alter tablespace users online';

}


示例二:表空间数据文件所在磁盘故障:

RMAN> run{

 sql 'alter tablespace users offline for recover';

 set newname for datafile 4 to  'd:\demo\users01.dbf';

 restore tablespace user;

 switch datafile all;

recover tablespace users;

sql 'alter tablespace users online';

}



数据块介质恢复:

只有当访问到这些坏块的时候才会报错。如报错:

ora-01578:oracle data block corrupted (file# 5, block# 21)

ora-01110:data file 5 :’d:\demo\uyser01,dbf‘

使用命令如下:RMAN >  blockrecover device type disk datafile 5 block 21 ,48 ,128;



RMAN不完全恢复:

rman的不完全恢复能在mount状态下完成。

1、基于时间恢复:当rman执行基于时间点的 不完全恢复时,首先要在命令行设置环境变量NLS_DATE_FORMAT。进入rman之后,先mount数据库,再使用SET UNTIL TIME 命令执行要恢复到的时间点。示例:

C:\> set nls_date_format = yyyy-mm-dd hh24:mi:ss

C:\>rman target sys/oracle@demo nocatalog

RMAN > run{

startup force mount;

set until time = '2012-05-08 17:00:28';

restore database;

recover database;

sql 'alter database open resetlogs';

}


当使用resetlogs选项打开数据库之后,会复位日志序列号,并生成新的数据库副本,在10g之前,不完全恢复之后必须重新备份数据库,10g之后,oracle提供了安全机制可以确保归档日志不会被覆盖,从而使得在恢复数据库时可以使用早期数据库副本的备份,但在执行了不完全恢复之后,建议删除早期的所有备份,并重新备份数据库。示例:

RMAN > run {

 delete  noprompt backup;

 delete noprompt copy;

 backup database format =’d:backup\%d_%s.bakj‘;

 sql 'alter system archive log current';

}


基于SCN的恢复:


首先查询当前scn号:SQL> select current_scn from v$databse;

然后删除一个表scott.emp。

示例如下:RMAN > run{

 startup force mount;

set until scn = 511416;

restore database;

recover database;

sql 'alter database open resetlogs';

}


当使用resetlogs选项打开数据库之后,会复位日志序列号,并生成新的数据库副本,在10g之前,不完全恢复之后必须重新备份数据库,10g之后,oracle提供了安全机制可以确保归档日志不会被覆盖,从而使得在恢复数据库时可以使用早期数据库副本的备份,但在执行了不完全恢复之后,建议删除早期的所有备份,并重新备份数据库。示例:

RMAN > run {

 delete  noprompt backup;

 delete noprompt copy;

 backup database format =’d:backup\%d_%s.bakj‘;

 sql 'alter system archive log current';

}



基于日志序列号恢复:

假定我们在执行完全备份恢复失败时,出现了如下错误

这种情况下dba可以实用基于日志序列号的不完全恢复:示例:

RMAN > run{

startup force mount;

set until sequence = 6;

restore database;

recover database;

sql ’alter database open resetlogs‘;

}


当使用resetlogs选项打开数据库之后,会复位日志序列号,并生成新的数据库副本,在10g之前,不完全恢复之后必须重新备份数据库,10g之后,oracle提供了安全机制可以确保归档日志不会被覆盖,从而使得在恢复数据库时可以使用早期数据库副本的备份,但在执行了不完全恢复之后,建议删除早期的所有备份,并重新备份数据库。示例:

RMAN > run {

 delete  noprompt backup;

 delete noprompt copy;

 backup database format =’d:backup\%d_%s.bakj‘;

 sql 'alter system archive log current';

}



基于备份控制文件恢复:

是指实用备份控制文件恢复数据库的过程,当误删除了表空间或者数据库所有控制文件全部损坏时,可以使用这种方法。下面模拟dba用户删除了users表空间为例,说明基于备份控制文件恢复的方法;

SQL> drop tablespace user01 including contents;

通过查询alert文件可以确定误操作时间,alert文件位置:background_dump_dest所对应的目录中,文件名格式:alert_mynewdb.log查看alert文件时,应该有文件尾部向上查看,可以看到删除该表的具体时间,大概为2012-05-08 22:13:34 ,只要恢复到该时间点就可以了,注意:当使用基于备份控制文件的rman不完全恢复时,必须使用恢复目录,将控制文件内的rman元数据周期性写到恢复目录中去,如果没有使用恢复目录,那就要求激活控制文件自动备份功能,否则就不能转储控制文件备份,转储控制文件之前,需要使用set dbid命令,设置数据库id编号,在转储了控制文件之后装载数据库,然后执行基于时间点的rman不完全恢复。示例:

C:\> set nls_date_format = yyyy-mm-dd hh24:mi:ss

C:\>rman target sys/oracle@demo nocatalog

RMAN > startup force nomount

RMAN > set dbid = 3282656886;

RMAN > restore controlfile from autobackup maxseq 6;

RMAN > alter database mount

RMAN >run{

set until time = '2012-05-08 22:13:34';

restore database;

recover database;

sql 'alter database open resetlogs';

}


当使用resetlogs选项打开数据库之后,会复位日志序列号,并生成新的数据库副本,在10g之前,不完全恢复之后必须重新备份数据库,10g之后,oracle提供了安全机制可以确保归档日志不会被覆盖,从而使得在恢复数据库时可以使用早期数据库副本的备份,但在执行了不完全恢复之后,建议删除早期的所有备份,并重新备份数据库。示例:

RMAN > run {

 delete  noprompt backup;

 delete noprompt copy;

 backup database format =’d:backup\%d_%s.bakj‘;

 sql 'alter system archive log current';

}

版权声明:本文首发在云栖社区,遵循云栖社区版权声明:本文内容由互联网用户自发贡献,版权归用户作者所有,云栖社区不为本文内容承担相关法律责任。云栖社区已升级为阿里云开发者社区。如果您发现本文中有涉嫌抄袭的内容,欢迎发送邮件至:developer2020@service.aliyun.com 进行举报,并提供相关证据,一经查实,阿里云开发者社区将协助删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章