Oracle备份恢复场景总结一、数据文件、表空间恢复1、数据库文件恢复1>场景一:问题描述:test.dbf丢失,有RMAN备份。
重启报错:Startup;ORA-01157: cannot identify/lock data file 5 - see DBWR trace file ORA-01110: data file 5: '/oracle/app/oracle/oradata/orcl/test01.dbf'run{startup mount;allocate channel ch00 type 'SBT_TAPE';restore datafile 5;recoverdatafile 5;alter database open;release channel ch00;}2>场景二问题描述:模拟test表空间损坏,删除数据文件(恢复到新目录)旧目录:/oracle/app/oracle/oradata新目录: /home/oraclerun{allocate channel ch00 type 'SBT_TAPE';sql 'alter database datafile 5 offline';setnewname for datafile 5 to '/home/oracle/test01.dbf';restoredatafile 5;switchdatafile 5;recoverdatafile 5;sql 'alter database datafile 4 online';release channel ch00;}说明:set newname for 告诉RMAN 还原数据文件的新位置在哪里。
这个命令在restore 前出现。
switch datafile更新controlfile,记录这个新位置。
这个命令要在recover 前出现2、表空间恢复恢复误删除表空间(已备份),RMAN 必须通过备份的控制文件(与之配套的老控制文件)进行恢复。
run{startupnomount;allocate channel d1 type sbt;restorecontrolfile from '/bk_43_1_920726015';sql 'alter database mount';set until time '2016-08-24 13:17:16';restore database;recover database;alter database open read only;release channel d1;}确保没问题在:shutdown abort;startup mount;alter database open resetlogs;二、控制文件恢复1、场景一:控制文件自动备份的恢复startupnomountset dbidxxxx需指定DBIDrestorecontrolfilefrom autobackup;alter database mount;recover database;alter database open resetlogs;如何寻找DBID?1.既然是默认路径,那么就去默认路径寻找,一般在$ORACLE_HOME/dbs目录下,例如c-361654012-20150312-04,其中361654012就是DBID2.在数据文件的头部含有DBID2、场景一:控制文件从非默认地方恢复这里控制文件从nbu备份的磁带上恢复备份路径startupnomount#从本地恢复restore controlfile from ‘/u01/c-361654012-20150312-04’;在此之前无需指定DBID 或者#从SBT_TAPE恢复restorecontrolfile from '/cntrl_23_1_920645270';run{allocate channel d1 type sbt;restorecontrolfile from '/cntrl_23_1_920645270';sql 'alter database mount';recover database;sql 'alter database open resetlogs';release channel d1;}注释:1>、restore controlfile必须写在run块了,否则报错:RMAN-06172: no AUTOBACKUP found or specified handle is not a valid copy or piece2>sbt的磁带号-/cntrl_23_1_920645270可以从已备份成功的任务里查看。
三、Redo 文件恢复联机重做日志的3种状态:current 当前inactive 非活动active 活动观察数据恢复是否需要联机重做日志来恢复。
1.inactive日志丢失的恢复—实例恢复不需要2.active日志丢失的恢复:日志组对应的脏块还没有从data buffer 写入到data file,不能被覆盖(但已写入到归档里)—实例恢复需要3.current日志丢失的恢复—实例恢复需要1、场景一:inactive日志丢失的恢复1>正常关闭数据库后(redo的丢失就属于inactive日志丢失的恢复)shutdown immediaterm redo*startup mountalter database clear logfile '/u01/app/oracle/oradata/ortest/redo01.log';## alter database clear logfile group n;也行alter database clear logfile '/u01/app/oracle/oradata/ortest/redo03.log';alter database clear unarchivedlogfile '/u01/app/oracle/oradata/ortest/redo02.log';alter database open;此情况不会丢失数据。
起来后多切几遍日志,看是否正常:alter system switch logfile;注意事项:必须clear 完非current log之后,才能clear unarchived current log(当你不带参数unarchived而clear当前日志的时候会提示你日志需要归档)。
2>非关闭数据库后(inactive日志丢失)shutdown abortrm redo01.logstartup mountalter database clear logfile '/u01/app/oracle/oradata/ortest/redo01.log';alter database open;此种情况不会丢失数据2、场景二:active日志丢失非正常关闭数据库,active日志丢失shutdown abortrm redo01.logstartup mountrecover database until cancel;alter database open resetlogs;此种情况不会丢失数据。
(active的日志已写入归档)3、场景三:current日志丢失此种情况会丢失数据:shutdown abortrm redo01.logstartup mountalter system set "_allow_resetlogs_corruption"=true scope=spfile;添加隐藏参数recover database until cancel;alter database open resetlogs;四、不完全恢复RMAN不完全恢复:三个标准模式:基于time、基于scn和基于sequence还有一种是基于cancel的恢复(注意是在SQL下执行)在不完全恢复时,有时为了保险往往一步把数据库open read only,确保没问题再open resetlogs:alter database open read only;启动到mount下执行:run {allocate channel c1 type disk;allocate channel c2 type disk;set until time '2016-06-06 11:54:05';restore database;recover database;alter database open resetlogs;}//基于scn的方法与基于time 相似,语法是set until scn 6689163;//基于日志的方法类似手工恢复的例子,语法是set until sequence 3;//有时报错格式不对恢复前执行://linux操作系统:export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'五、database恢复1、原机器恢复1>恢复spfile文件-到nomount状态:可以从数据库模板里随便找个pfile起到mount下,再恢复spfile。
因为分配channel 必须得在nomount下面:rman>run{allocate channel c1 type sbt;restorespfile from '/al_63_1_920727874'; release channel c1;}2>恢复控制文件-到mount状态run{allocate channel c1 type sbt; restorecontrolfile from '/cntrl_64_1_920727890'; sql 'alter database mount';release channel c1;}3>恢复数据文件-以read only打开run{allocate channel c1 type sbt;allocate channel c2 type sbt;allocate channel c3 type sbt;allocate channel c4 type sbt;set until time '2016-08-24 13:40:00';restore database;recover database;sql 'alter database open read only';release channel c1;release channel c2;release channel c3;release channel c4;}注释:查看恢复用到的截止时间戳:用list backup;查看备份的归档最后的时间:4>打开数据库确定无误后,已resetlogs打开数据库:shutdown abort;startup mount;alter database open resetlogs;2、异机恢复:参考原机器恢复,主要的就是,再每个run里面写着一条:run{….SEND 'NB_ORA_CLIENT=rac1;…}rac1是nbu上原机器的client名字。