oracle 备份恢复语句整理(最全)

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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/oracle
run{
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、场景一:控制文件自动备份的恢复
startupnomount
set dbidxxxx需指定DBID
restorecontrolfilefrom autobackup;
alter database mount;
recover database;
alter database open resetlogs;
如何寻找DBID?
1.既然是默认路径,那么就去默认路径寻找,一般在$ORACLE_HOME/dbs目录下,
例如c-361654012-20150312-04,其中361654012就是DBID
2.在数据文件的头部含有DBID
2、场景一:控制文件从非默认地方恢复
这里控制文件从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 piece
2>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 immediate
rm redo*
startup mount
alter 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 abort
rm redo01.log
startup mount
alter database clear logfile '/u01/app/oracle/oradata/ortest/redo01.log';
alter database open;
此种情况不会丢失数据
2、场景二:active日志丢失
非正常关闭数据库,active日志丢失
shutdown abort
rm redo01.log
startup mount
recover database until cancel;
alter database open resetlogs;
此种情况不会丢失数据。

(active的日志已写入归档)
3、场景三:current日志丢失
此种情况会丢失数据:
shutdown abort
rm redo01.log
startup mount
alter 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名字。

具体参考另外一个work文档。

附录
1、rman里allocate的单独用法:
RMAN>allocate channel for maintenance device type sbtparms 'SBT_LIBRARY=oracle.disksbt, ENV=(BACKUP_DIR=/tmp)';
allocated channel: ORA_MAINT_SBT_TAPE_1
channel ORA_MAINT_SBT_TAPE_1: SID=63 device type=SBT_TAPE
channel ORA_MAINT_SBT_TAPE_1: WARNING: Oracle Test Disk API
2、手工注册备份集到控制文件:
rman target /
configure CHANNEL device type 'SBT_TAPE' PARMS 'ENV=(NB_ORA_CLIENT=rac1)';
catalog device type 'SBT_TAPE' backuppiece '/bk_6177_1_923273904';
3、不完全恢复后的注意事项
不完全恢复后归档肯定有丢失,这是需要执行以下操作:
RMAN>crosscheck archivelog all;
RMAN>delete expired archivelog all;
最后再做全备份。

相关文档
最新文档