一、丢失重要或不重要的数据文件时,使用RMAN执行完整恢复
一般而言,在发生数据库故障后,需要使用两个步骤进行恢复:从备份位置还原一个或多个数据文件,然后应用归档和联机重做日志文件,将整个数据库或单独数据文件前滚到指定的系统更改号SCN。
对于任何恢复过程而言,第一个步骤都是执行RESTORE命令,使用RESTORE命令时,RMAN会从磁盘或磁带检索一个或多个数据文件,以及恢复所需要的任何归档重做日志文件。发出RECOVER命令时,RMAN会将归档和联机重做日志文件中已经提交的更改应用于已经还原的数据文件中。
1、为不重要的文件执行完整恢复
如果丢失的数据文件不在SYSTEM或UNDO表空间中,就将其视为不重要的数据文件。当数据库处于ARCHIVELOG模式时,不属于SYSTEM或UNDO表空间的丢失或受损数据文件的影响范围仅限于受损或丢失数据文件中的对象。
通常恢复步骤如下:
1)如果数据库处于打开状态,offline表空间:alter tablespace xxx offline immediate;
2)使用RESTORE命令,从备份位置加载表空间的数据文件:restore tablespace xxx;
3)使用RECOVER命令,将归档和联机重做日志文件应用于已经还原的数据文件:recover tablespace xxx;
4)使表空间联机:alter tablespace xxx online;
2、执行重要文件的完整恢复
1)如果数据库处于打开状态,使用shtudown abort命令关闭数据库。
2)使用startup mount命令重新打开数据库。
3)使用RMAN RESTORE命令,从备份位置复制(或还原)重要表空间的数据文件。
4)使用RMAN RECOVER命令应用任何归档或联机重做日志文件
5)使用ALTER DATABASE OPEN命令重新打开数据库。
二、使用RMAN执行不完整恢复
将数据库恢复到过去某个时间点。通过使用还原点,使用RMAN或闪回数据库执行不完整恢复。
EX1:执行不完整恢复来还原USERS表空间
1)创建针对当前SCN的还原点。
create restore point before_disaster_strikes;
2)删除example表空间的一些表或视图
drop table hr.job_history;
drop view hr.emp_details_view;
3)关闭实例,并以mount模式重新启动数据库
shutdown immediate;
startup mount;
4)使用RMAN,利用还原点进行恢复
run
{
set until restore point before_disaster_strikes;
restore database;
recover database;
}
5)使用RESETLOGS方式打开数据库
alter database ope resetlogs;
三、使用增量更新备份进行恢复
通过在备份和恢复策略中使用映像副本,将可以极大的减少还原数据文件或整个数据库的时间。映像副本使用天然的Oracle数据文件格式,无需从压缩或解压缩后的RMAN备份集重新创建。
在任何使用映像副本的恢复场景中更新包含增量备份的映像副本时,只需要应用自上次增量备份以来生成的归档和联机重做日志文件,不需要再执行数据文件和数据库的完全映像复制。如果数据文件存在多个映像副本,RMAN会自己识别选择最新的映像副本。
1、实施映像副本策略
在创建整个数据库的映像副本后,每天都增量更新映像副本:
run {
recover copy of database with tag 'inc_upd';
backup incremental level 1 for recover of copy with tag 'inc_upd' database;
}
第一次运行时:
不存在要还原的级别0的映像副本,同样也没有级别0增量备份。
Starting recover at 25-MAY-08
using channel ORA_DISK_1
no copy of datafile 1 found tb recover
Starting backup at 25-MAY-08
using channel ORA_DISK_1
no parent backup or copy of datafile 1 found
第二次运行时:
如果在执行级别1备份时不存在任何级别0备份,RMAN将自动创建级别0备份。第二次运行时,存在级别0备份,但不存在增量级别0备份,因此RMAN块中的RECOVER命令将生成以下信息:
Starting recover at 25-MAY-08
using channel ORA_DISK_1
no copy of datafile 1 found tb recover
Starting backup at 25-MAY-08
using channel ORA_DISK_1
channel ORA_DISK_1:starting incremental level 1 datafile backup set
第三次运行时:
RECOVER命令会使用最新的级别1备份更新映像副本,从而执行另一个级别1增量备份。下次执行RUN块时,同样会这样操作。结果,在第三次调用此脚本后,如果执行任何恢复操作,只需要使用映像副本、一个增量备份以及自上一次级别1增量备份以来生成的任何归档和联机重做日志。
注:务必在增量更新的映像副本策略中使用标记。
四、切换使用映像副本以便加快恢复速度
1、使包含缺失数据文件的表空间脱机。可以使用动态性能视图v$recover_file、v$datafile_header或v$tablespace来确定需要恢复的数据文件
2、使用RMAN SWITCH TO ...COPY指向缺失数据文件的映像副本
3、使用RMAN RECOVER命令恢复数据文件
4、再次使表空间联机
EX1:使用switch命令快速恢复数据文件
1)select ts#,name from v$tablespace where ts#=:a;
select file#,status,error,recover,tablespace_name,name from v$datafile_header where recover='YES';
2)alter tablespace xxx offline immediate;
3)RMAN>switch tablespace xxx to copy;
4)RMAN>recover tablespace users;
5)alter tablespace xxx online;
EX2:在原来的位置创建了xxx表空间的数据文件后使用swtich命令
select file#,df.name,ts#,ts.name from v$datafile df,v$tablespace ts where df.ts# = ts.ts#;
1)创建返回原始位置的数据文件的映像副本
backup as copy tablespace xxx format 'xxxx.dbf';
2)使表空间脱机,以便为switch命令做准备
alter tablespace xxx offline;
3)切换到新创建的副本
switch tablespace xxx to copy;
4)在新位置恢复数据文件
recover tablespace xxx;
5)表空间联机
alter tablespace xxx online;
6)验证恢复是否成功
select file#,df.name,ts#,ts.name from v$datafile df,v$tablespace ts where df.ts# = ts.ts#;
7)创建新映像副本以供数据文件再次消失时使用。
backup as copy tablespace xxx;
EX3:将RMAN SET NEWNAME与快速切换一起使用
run {
sql "alter tablespace xxx offline immediate";
set newname for datafile '' to '';
restore tablespace xxx;
recover tablespace xxx;
sql "alter tablespace xxx online";
}
五、将数据库还原到新主机上
使用RMAN,可以按多种方式将数据库方便地还原到新主机上。
1、准备新主机
1)记录源数据库的DBID
select dbid from v$database;
2)将初始化参数文件从源库复制到新主机中。
3)确保新主机可以使用所有源数据库备份内容,不要连接到恢复目录。
2、在新主机上执行还原和恢复
步骤:
1)在新主机上配置环境变量。
2)使用NOCATALOG方式连接到新目标数据库。
3)设置DBID
4)使用NOMOUNT方式启动实例
5)根据备份还原SPFILE
6)关闭新实例
7)编辑PFILE
8)再次使用NOMOUNT方式启动实例
9)创建RMAN RUN块来还原控制文件
10)创建RMAN RUN块来还原和恢复数据库
11)使用RESETLOGS打开数据库
示例:
1)新主机设置环境变量
$export ORACLE_SID=xxx
2)使用NOCATALOG方式连接到新目标数据库,但不要连接到恢复目录
$rman target /
3)设置DBID
RMAN>set dbid xxx; ---源数据库的
4)使用NOMOUNT方式启动实例
sql>startup nomount
5)根据备份还原SPFILE
RMAN>restore spfile to pfile 'xxxx' from autobackup;
6)关闭新实例
shutdown immediate
7)编辑PFILE
8)再次以NOMOUNT方式启动实例
sql>startup force nomount pfile='xxxxx';
9)创建RMAN RUN块来还原控制文件
run {
restore contraolfile from autobackup; --恢复到初始化参数control_files指定的位置
alter database mount;
}
10)创建RMAN RUN块来还原和恢复数据库
run {
set newname for datafile 1 to '';
set until scn yyy;
restore database;
switch datafile all;
recover database;
}
11)alter database open resetlogs;
六、使用备份控制文件进行恢复
在极少数情况下,可能丢失当前控制文件的所有副本,最新RMAN备份中也至少有一个自动备份控制文件,另外,如果正在使用恢复目录,可以在恢复目录中找到最新控制文件中的所有元数据。
如果SPFILE未保存在镜像外部文件系统或镜像ASM磁盘组中,则此文件也有丢失的嫌疑,在RMAN自动备份控制文件时,会同时备份当前控制文件和SPFILE。
1、使用自动备份还原SPFILE
RMAN>set dbid xxx;
RMAN>startup force nomount;
RMAN>restore spfile from autobackup;
RMAN>startup force;
2、使用自动备份还原控制文件
RMAN>startup nomount;
RMAN>restore controlfile from autobackup;
RMAN>alter database mount;
RMAN>recover database;
RMAN>alter database open resetlogs;
如果初始化参数指定的控制文件不可用,可以使用下述方法:
RMAN>restore controlfile to '' from autobackup;
七、执行灾难恢复
1、以NOARCHIVELOG模式执行恢复
1)如果尚未关闭实例,请将其关闭
2)使用操作系统命令,将所有数据文件和控制文件还原到原来的位置,如果原来的位置不可用,则将其还原到新的位置。
3)如果还原的控制文件位于新位置中,则更新已经还原的初始化参数文件中的control_files参数。
4)使用startup mount启动数据库。
5)如果原来的位置不可使用,则使用alter database rename来更改数据文件和联机重做日志文件的位置。
6)运行recover database until cancel命令,模拟执行一个不完整恢复过程,重新设置联机重做日志文件:直接指定CANCEL。
7)使用alter database open resetlogs打开数据库。
2、以noarchivelog模式使用增量备份
如果以noarchivelog模式运行数据库,但是定期执行增量备份,则可以采用级别0增量备份,并应用级别1增量备份,将数据库恢复到最近的增量备份时间点。增量备份必定是一致的备份,也就是说,在数据库处于mount状态时进行备份。另外,必须使用normal、immediate或transactional关闭数据库,以确保素有数据文件和控制文件都有同步的系统更改号SCN。
startup force nomount;
restore controlfile;
alter database mount;
restore database;
recover database noredo;--丢失联机日志时才需要使用noredo;
alter database open resetlogs;