场景 |
恢复方法 |
恢复条件 |
|
其中一个控制文件损坏 |
1.1 拷贝冗余的控制文件 |
||
同上、但不推荐该方法进行恢复 |
|||
所有的控制文件损坏 |
有备份 |
2.1 通过rman备份控制文件进行完全恢复 |
|
2.2 通过rman备份控制文件进行不完全恢复 |
|||
2.3 通过trace备份控制文件进行完全恢复 |
|||
2.4 通过trace备份控制文件进行不完全恢复 |
|||
无备份 |
2.5 通过手工重建控制文件进行恢复(noresetlogs) |
||
2.6 通过手工重建控制文件进行恢复(resetlogs) |
|||
2.7 通过SNAPSHOT CONTROLFILE文件进行恢复 |
二、不同场景控制文件损坏的恢复思路及演示
2.1 其中一个控制文件损坏恢复思路
A. shutdown abort 关闭数据库(控制文件损坏后不能正常关闭数据库,只能使用abort强制关闭)
B. 拷贝其中一个完好的控制文件(推荐)或者修改control_files参数去除损坏文件(不推荐)
C. startup启动数据库
2.2 其中一个控制文件损坏恢复演示
sql>showparametercontrol_files NAMETYPEVALUE ---------------------------------------------------------------------------------------- control_filesstring/u/app/oracle/oradata/racdg/control01.ctl,/u/app/oracle/ora data/racdg/control02.ctl sql>!mv/u/app/oracle/oradata/racdg/control02.ctl/u/app/oracle/oradata/racdg/control02.ctl.bak sql>shutdownimmediate;--无正常关闭数据库,需要abort强制关闭 ORA-00210:cannotopenthespecifiedcontrolfile ORA-00202:controlfile:'/u/app/oracle/oradata/racdg/control02.ctl' ORA-27041:unabletoopenfile Linux-x86_64Error:2:Nosuchfileordirectory Additionalinformation:3 sql>shutdownabort;--只能shutdownabort强制关闭,建议先altersystemcheckpoint之后再关闭 ORACLEinstanceshutdown. sql>startup;--启动数据库 ORACLEinstancestarted. ORA-00205:errorinidentifyingcontrolfile,checkalertlogformoreinfo--启动报错,找不到指定的控制文件,在告警日志文件alert_sid.log中可以看到如下报错: ORA-00210:cannotopenthespecifiedcontrolfile ORA-00202:controlfile:'/u/app/oracle/oradata/racdg/control02.ctl' sql>!pwd /u/app/oracle/oradata/racdg sql>!cpcontrol01.ctlcontrol02.ctl 或者: sql>altersystemsetcontrol_files=’/u/app/oracle/oradata/racdg/control01.ctl’scope=both;--不建议,因为这样一来就只剩一份控制文件了,起不到冗余作用,再此次发生丢失,恢复就变得麻烦了。 sql>alterdatabasemount; Databasealtered.
sql>showparametercontrol_files; NAMETYPEVALUE ----------------------------------------------------------------------------- control_filesstring+DATA/racdb/controlfile/current.256.935676497,+DATA/racdb/c ontrolfile/current.478.957977179 sql>shutdownabort;--这里我是为了演示才直接关闭数据的,因为在线情况下asm的文件是不能删除的 ORACLEinstanceshutdown. sql>!su-grid-c"asmcmd-prm+DATA/racdb/controlfile/current.478.957977179" Password: sql>startupnomount;--将数据库启动到nomount状态 ORACLEinstancestarted. sql>!rmantarget/--这里使用rman来恢复,当然使用之前的两种方法拷贝和去除也是可以的 RecoveryManager:Release11.2.0.4.0-ProductiononSatOct2116:53:152017 Copyright(c)1982,2011,Oracleand/oritsaffiliates.Allrightsreserved. connectedtotargetdatabase:RACDB(notmounted) RMAN>restorecontrolfilefrom'+DATA/racdb/controlfile/current.256.935676497';--其实这里就是拷贝的方式 Startingrestoreat2017/10/2116:54:18 usingtargetdatabasecontrolfileinsteadofrecoverycatalog allocatedchannel:ORA_DISK_1 channelORA_DISK_1:SID=143instance=racdb1devicetype=DISK channelORA_DISK_1:copiedcontrolfilecopy outputfilename=+DATA/racdb/controlfile/current.256.935676497 outputfilename=+DATA/racdb/controlfile/current.478.957977659 Finishedrestoreat2017/10/2116:54:22 RMAN>sql'alterdatabasemount'; sqlstatement:alterdatabasemount releasedchannel:ORA_DISK_1
说明一下,这里我分了文件系统和ASM存储存放控制文件的情况,其恢复原理都是一样的,无论是在线或者关闭数据库后损坏了其中部分控制文件,恢复方法都是一样的。
2.3所有的控制文件损坏,有备份场景
2.3.1通过rman备份控制文件进行完全恢复思路
A. 若在线损坏,shutdown abort关闭数据库;若关闭数据库后损坏,到第二步
B. startup nomount启动数据库到nomount状态。
C. 使用rman从备份中恢复控制文件:restorecontrolfile from '/path';
D. alter database mount;启动数据库到mount状态
E. recover database using backupcontrolfile until cancel; 应用归档文件
F. 再执行recover databaseusing backup controlfile; 应用未归档的redo文件
G. alter database open resetlogs; 以resetlogs的方式打开数据库
2.3.2通过rman备份控制文件进行完全恢复演示
sql>showparametercontrol_files; NAMETYPEVALUE ---------------------------------------------------------------------------------------- control_filesstring/u/app/oracle/oradata/racdg/control01.ctl,/u/app/oracle/ora data/racdg/control02.ctl,/u/app/oracle/oradata/racdg/control03 .ctl sql>!rmcontrol01.ctlcontrol02.ctlcontrol03.ctl--删除所有的控制文件,模拟控制文件丢失 sql>shutdownabort;--强制关闭数据库 ORACLEinstanceshutdown. sql>startup;--启动数据到nomount状态 ORACLEinstancestarted. ORA-00205:errorinidentifyingcontrolfile,checkalertlogformoreinfo--报错,同时查看告警日志,会发现所有控制文件都已经丢失。 sql>!rmantarget/--此前有做过RMAN控制文件备份,使用rman进行恢复 RecoveryManager:Release11.2.0.4.0-ProductiononSatOct2117:24:112017 Copyright(c)1982,Oracleand/oritsaffiliates.Allrightsreserved. connectedtotargetdatabase:RACDG(notmounted) RMAN>restorecontrolfilefrom'/u/app/oracle/zwdir/RACDG_20171021_0fshj32i_1_1.ctl';--恢复控制文件 Startingrestoreat2017/10/2117:24:57 usingtargetdatabasecontrolfileinsteadofrecoverycatalog allocatedchannel:ORA_DISK_1 channelORA_DISK_1:SID=135devicetype=DISK channelORA_DISK_1:restoringcontrolfile channelORA_DISK_1:restorecomplete,elapsedtime:00:00:03 outputfilename=/u/app/oracle/oradata/racdg/control01.ctl outputfilename=/u/app/oracle/oradata/racdg/control02.ctl outputfilename=/u/app/oracle/oradata/racdg/control03.ctl Finishedrestoreat2017/10/2117:25:01 RMAN>sql'alterdatabasemount';-将数据库启动到mount状态 sqlstatement:alterdatabasemount releasedchannel:ORA_DISK_1 RMAN>exit RecoveryManagercomplete. sql>recoverdatabaseusingbackupcontrolfileuntilcancel; ORA-00279:change1041001generatedat10/21/201716:04:25neededforthread1 ORA-00289:suggestion:/u/app/oracle/oradata/arch/1_6_957480185.dbf ORA-00280:change1041001forthread1isinsequence#6 Specifylog:{<RET>=suggested|filename|AUTO|CANCEL} auto ORA-00279:change1041011generatedat10/21/201716:20:36neededforthread1 ORA-00289:suggestion:/u/app/oracle/oradata/arch/1_7_957480185.dbf ORA-00280:change1041011forthread1isinsequence#7 ORA-00278:logfile'/u/app/oracle/oradata/arch/1_6_957480185.dbf'nolongerneededforthisrecovery ORA-00279:change1041019generatedat10/21/201716:20:36neededforthread1 ORA-00289:suggestion:/u/app/oracle/oradata/arch/1_8_957480185.dbf ORA-00280:change1041019forthread1isinsequence#8 ORA-00278:logfile'/u/app/oracle/oradata/arch/1_7_957480185.dbf'nolongerneededforthisrecovery ORA-00308:cannotopenarchivedlog'/u/app/oracle/oradata/arch/1_8_957480185.dbf' ORA-27037:unabletoobtainfilestatus--缺少序号为8的归档,这是因为redo还存在归档未切换 Linux-x86_64Error:2:Nosuchfileordirectory Additionalinformation:3 ORA-01547:warning:RECOVERsucceededbutOPENRESETLOGSwouldgeterrorbelow ORA-01194:file1needsmorerecoverytobeconsistent ORA-01110:datafile1:'/u/app/oracle/oradata/racdg/system01.dbf' sql>selecta.group#,a.sequence#,a.archived,a.status,b.memberfromv$loga,v$logfilebwherea.group#=b.group#; GROUP#SEQUENCE#ARCHIVSTATUSMEMBER -------------------------------------------------------------------------------------------------------------------- 14YESINACTIVE/u/app/oracle/oradata/racdg/redo01.log 36NOCURRENT/u/app/oracle/oradata/racdg/redo03.log--当前未归档的redo文件 25YESINACTIVE/u/app/oracle/oradata/racdg/redo02.log sql>recoverdatabaseusingbackupcontrolfile;--再次执行,应用未归档的redo文件 ORA-00279:change1041019generatedat10/21/201716:20:36neededforthread1 ORA-00289:suggestion:/u/app/oracle/oradata/arch/1_8_957480185.dbf ORA-00280:change1041019forthread1isinsequence#8--这里看到未归档的redo文件,归档序号为6,而这里需要恢复序列为8的归档,所以应该是应用/u/app/oracle/oradata/racdg/redo02.log这个redo文件。 Specifylog:{<RET>=suggested|filename|AUTO|CANCEL} /u/app/oracle/oradata/racdg/redo02.log Logapplied. Mediarecoverycomplete. sql>alterdatabaSEOpenresetlogs;--以resetlogs的方式打开数据库 Databasealtered.
resetlogs与noresetlogs的区别说明:
norestlogs控制文件的scn是来自当前日志的highscn,而resetlogs控制文件的scn是来自数据文件。
noresetlogs会继续使用已经存在,且有效的logfiles,而resetlogs会初始化logs,重置log sequence号,创建一个新的incarnation
2.3.3通过rman备份控制文件进行不完全恢复思路
A. 若在线损坏,shutdown abort关闭数据库;若关闭数据库后损坏,到第二步
B. startup nomount启动数据库到nomount状态。
C. 使用rman从备份中恢复控制文件:restorecontrolfile from '/path';
D. alter database mount;启动数据库到mount状态
E. recover database using backupcontrolfile until cancel; 应用尽可能多的归档文件
G. 若丢失redo文件:
shutdown immediate并启动到startupnomount状态
alter database backup controlfile to traceas ‘/u/app/oracle/zwdir/controlfile.sql’; 生成创建控制文件的脚本
使用resetlogs方式创建控制文件
若未归档的redo文件可用:直接recover database,选用未归档的redo应用,alter database open resetlogs方式打开数据库
若未归档的redo文件不可用:设置隐含参数_allow_resetlogs_corruption=true跳过一致性检查,alterdatabase open resetlogs方式打开数据库
F. 若丢失归档文件:
shutdown immediate并启动到startupnomount状态
alter database backup controlfile to traceas ‘/u/app/oracle/zwdir/controlfile.sql’; 生成创建控制文件的脚本
使用noresetlogs方式创建控制文件
recover database using backup controlfileuntil cancel; 应用redo文件
alter database open resetlogs; 以resetlogs的方式打开数据库
若备份控制文件之后,数据库结构发生了变化,如新增了表空间或数据文件,需要进行不完全恢复
2.3.4通过rman备份控制文件进行不完全恢复演示
这里模拟演示模拟备份控制文件之后,新增表空间,归档文件全部丢失的不完全恢复的情况,丢失redo的情况,请看下一节“oracle数据库恢复系列之redo文件恢复”
[oracle@iscsi-asmzwdir]$rmantarget/ RMAN>backupcurrentcontrolfileformat'/u/app/oracle/zwdir/use_this_%U.ctl'tag='ctl';--备份当前的控制文件 Startingbackupat2017/10/2917:03:31 usingtargetdatabasecontrolfileinsteadofrecoverycatalog piecehandle=/u/app/oracle/zwdir/use_this_08si88j3_1_1.ctltag=CTLcomment=NONE channelORA_DISK_1:backupsetcomplete,elapsedtime:00:00:01 Finishedbackupat2017/10/2917:03:33 [oracle@iscsi-asmracdg]$sqlplus/assysdba sql>createtablespacet_del_archdatafile'/u/app/oracle/oradata/racdg/t_del_arch01.dbf'size20m;--新增表空间 Tablespacecreated. sql>createusert_archidentifiedbypassworddefaulttablespacet_del_arch;--新建用户 Usercreated. sql>grantresource,connecttot_arch;--授权 Grantsucceeded. sql>altersystemswitchlogfile;--切换归档日志 Systemaltered. sql>createtablet_arch.t1asselect*fromdba_objectswhererownum<1000;-新建表,并插入数据 Tablecreated. sql>altersystemswitchlogfile;--切换归档日志 Systemaltered. sql>selectcount(*)fromt_arch.t1; COUNT(*) ---------- 999 sql>insertintot_arch.t1select*fromt_arch.t1;--新增数据 999rowscreated. sql>commit; Commitcomplete. sql>altersystemswitchlogfile;--切换日志 Systemaltered. sql>selectcount(*)fromt_arch.t1;--记录当前的数据,用作恢复的数据对比 COUNT(*) ---------- 1998 sql>archiveloglist;--当前归档的序号 DatabaselogmodeArchiveMode AutomaticarchivalEnabled Archivedestination/u/app/oracle/oradata/arch Oldestonlinelogsequence5 Nextlogsequencetoarchive7 Currentlogsequence7 sql>shutdownabort;--关闭数据库 ORACLEinstanceshutdown. sql>!rmcontrol01.ctlcontrol02.ctl--模拟控制文件丢失 sql>!mv/u/app/oracle/oradata/arch/*.dbf/u/app/oracle/oradata/arch/tmp--模拟归档文件全部丢失 sql>startupnomount; ORACLEinstancestarted. sql>!rmantarget/ RecoveryManager:Release11.2.0.4.0-ProductiononSunOct2917:19:332017 Copyright(c)1982,Oracleand/oritsaffiliates.Allrightsreserved. connectedtotargetdatabase:RACDG(notmounted) RMAN>restorecontrolfilefrom'/u/app/oracle/zwdir/use_this_08si88j3_1_1.ctl';--通过旧备份控制文件进行恢复 Startingrestoreat2017/10/2917:19:44 usingtargetdatabasecontrolfileinsteadofrecoverycatalog allocatedchannel:ORA_DISK_1 channelORA_DISK_1:SID=10devicetype=DISK channelORA_DISK_1:restoringcontrolfile channelORA_DISK_1:restorecomplete,elapsedtime:00:00:01 outputfilename=/u/app/oracle/oradata/racdg/control01.ctl outputfilename=/u/app/oracle/oradata/racdg/control02.ctl Finishedrestoreat2017/10/2917:19:46 RMAN>exit RecoveryManagercomplete. sql>alterdatabasemount; Databasealtered. sql>alterdatabasebackupcontrolfiletotraceas'/u/app/oracle/zwdir/controlfile.sql'; Databasealtered.--此时归档文件已经丢失了,无法通过应用归档文件进行恢复,所以通过trc新建控制文件的方式进行恢复。 sql>shutdownabort;--关闭数据库 ORACLEinstanceshutdown. sql>STARTUPNOMOUNT--启动到nomount状态 ORACLEinstancestarted. sql>CREATECONTROLFILEREUSEDATABASE"RACDG"NORESETLOGSARCHIVELOG MAXLOGFILES16 MAXLOGMEMBERS3 MAXDATAFILES100 MAXINSTANCES8 MAXLOGHISTORY292 LOGFILE GROUP1'/u/app/oracle/oradata/racdg/redo01.log'SIZE50MBLOCKSIZE512,GROUP2'/u/app/oracle/oradata/racdg/redo02.log'SIZE50MBLOCKSIZE512,GROUP3'/u/app/oracle/oradata/racdg/redo03.log'SIZE50MBLOCKSIZE512 --STANDBYLOGFILE DATAFILE '/u/app/oracle/oradata/racdg/system01.dbf','/u/app/oracle/oradata/racdg/sysaux01.dbf','/u/app/oracle/oradata/racdg/undotbs01.dbf','/u/app/oracle/oradata/racdg/users01.dbf' CHARACTERSETWE8MSWIN1252 ; --以上新建控制文件的内容就是通过/u/app/oracle/zwdir/controlfile.sql里面的记录来进行新建的,里面共有两种方式,一种是noresetlogs,另一种是resetlogs的方式。这里因为redo文件是没有丢失的,所以使用nosesetlogs的方式。 Controlfilecreated. sql>selectb.sequence#,a.member,b.statusfromv$logfilea,v$logbwherea.group#=b.group#;--查询redo信息 SEQUENCE#MEMBERSTATUS --------------------------------------------------------------------------------------- 7/u/app/oracle/oradata/racdg/redo01.logCURRENT 5/u/app/oracle/oradata/racdg/redo02.logINACTIVE 6/u/app/oracle/oradata/racdg/redo03.logINACTIVE sql>selectfile#,name,statusfromv$datafile;--查询数据文件信息,此时数据文件都是需要恢复 FILE#NAMESTATUS --------------------------------------------------------------------- 1/u/app/oracle/oradata/racdg/system01.dbfSYSTEM 2/u/app/oracle/oradata/racdg/sysaux01.dbfRECOVER 3/u/app/oracle/oradata/racdg/undotbs01.dbfRECOVER 4/u/app/oracle/oradata/racdg/users01.dbfRECOVER sql>recoverdatabaseusingbackupcontrolfileuntilcancel;--恢复数据库,应用redo日志 ORA-00279:change932267generatedat10/29/201717:07:56neededforthread1 ORA-00289:suggestion:/u/app/oracle/oradata/arch/1_6_958668721.dbf ORA-00280:change932267forthread1isinsequence#6 Specifylog:{<RET>=suggested|filename|AUTO|CANCEL} /u/app/oracle/oradata/racdg/redo03.log ORA-00279:change932300generatedat10/29/201717:09:10neededforthread1 ORA-00289:suggestion:/u/app/oracle/oradata/arch/1_7_958668721.dbf ORA-00280:change932300forthread1isinsequence#7 ORA-00278:logfile'/u/app/oracle/oradata/racdg/redo03.log'nolongerneededforthisrecovery Specifylog:{<RET>=suggested|filename|AUTO|CANCEL} /u/app/oracle/oradata/racdg/redo01.log Logapplied. Mediarecoverycomplete. sql>alterdatabaSEOpenresetlogs;--以resetlogs的方式打开数据库 Databasealtered. sql>selectfile#,statusfromv$datafile;--查看数据文件的状态,备份控制文件之后的表空间对应的数据文件需要进一步恢复。 FILE#NAMESTATUS ---------------------------------------------------------------------------- 1/u/app/oracle/oradata/racdg/system01.dbfSYSTEM 2/u/app/oracle/oradata/racdg/sysaux01.dbfONLINE 3/u/app/oracle/oradata/racdg/undotbs01.dbfONLINE 4/u/app/oracle/oradata/racdg/users01.dbfONLINE 5/u/app/oracle/product/11.2.0/db_1/dbs/MISSING00005RECOVER sql>alterdatabasedatafile5offline;--先将数据文件offline Databasealtered. sql>alterdatabaserenamefile'/u/app/oracle/product/11.2.0/db_1/dbs/MISSING00005'to'/u/app/oracle/oradata/racdg/t_del_arch01.dbf';--重命名数据文件 Databasealtered. sql>altertablespacet_del_archonline;---尝试将表空间online,报错 altertablespacet_del_archonline * ERRORatline1: ORA-01190:controlfileordatafile5isfrombeforethelastRESETLOGS ORA-01110:datafile5:'/u/app/oracle/oradata/racdg/t_del_arch01.dbf' sql>altersystemset"_allow_resetlogs_corruption"=truescope=spfile;修改参数,忽略SCN一致性校验 Systemaltered. sql>startupforce;--再将数据库重新启动 ORACLEinstancestarted. TotalSystemGlobalArea830930944bytes FixedSize2257800bytes VariableSize536874104bytes DatabaseBuffers285212672bytes RedoBuffers6586368bytes Databasemounted. DatabaSEOpened. sql>selectts#,file#,status,checkpoint_change#fromv$datafile;--查询数据文件的情况 TS#FILE#NAMESTATUSCHECKPOINT_CHANGE# ------------------------------------------------------------------------------------------------- 01/u/app/oracle/oradata/racdg/system01.dbfSYSTEM953040 12/u/app/oracle/oradata/racdg/sysaux01.dbfONLINE953040 23/u/app/oracle/oradata/racdg/undotbs01.dbfONLINE953040 44/u/app/oracle/oradata/racdg/users01.dbfONLINE953040 65/u/app/oracle/oradata/racdg/t_del_arch01.dbfRECOVER0 sql>altersessionsetevents'immediatetracenameadjust_scnlevel1';--通过设置adjust_scn使数据文件的CHECKPOINT_CHANGE#一致 Sessionaltered. sql>shutdownimmediate; Databaseclosed. Databasedismounted. ORACLEinstanceshutdown. sql>startupmount;--启动到mount状态 ORACLEinstancestarted. TotalSystemGlobalArea830930944bytes FixedSize2257800bytes VariableSize536874104bytes DatabaseBuffers285212672bytes RedoBuffers6586368bytes Databasemounted. sql>recoveruntilcancel;--恢复数据库,注意这里不是usingcontrolfile的方式 Mediarecoverycomplete. sql>alterdatabasedatafile2,3,4,5online;---将所有的数据文件online,记得千万不用漏了 Databasealtered. sql>alterdatabaSEOpenresetlogs;--以resetlogs的方式打开数据库 Databasealtered. sql>selectts#,checkpoint_change#fromv$datafile;--查询数据文件的情况 TS#FILE#NAMESTATUSCHECKPOINT_CHANGE# ------------------------------------------------------------------------------------------------- 01/u/app/oracle/oradata/racdg/system01.dbfSYSTEM953040 12/u/app/oracle/oradata/racdg/sysaux01.dbfONLINE953040 23/u/app/oracle/oradata/racdg/undotbs01.dbfONLINE953040 44/u/app/oracle/oradata/racdg/users01.dbfONLINE953040 65/u/app/oracle/oradata/racdg/t_del_arch01.dbfONLINE953040 sql>selectcount(*)fromt_arch.t1;--对比数据,发现存在数据丢失,出现这种情况,只能把损失降到最小 COUNT(*) ---------- 999 sql>altertablespacetempaddtempfile'/u/app/oracle/oradata/racdg/temp01.dbf'reuse;--重建temp表空间 Databasealtered.
2.3.4通过trace备份控制文件进行完全恢复思路
A.备份控制文件到trace:alterdatabase backup controlfile to trace as '/path/controlfile.sql';
B.若在线损坏,直接alterdatabase backup controlfile to 'file';之后重启数据库
C.若关闭数据库后损坏,shutdownabort关闭数据库后,startup nomount启动数据库到nomount状态
D.使用备份到trace里创建控制文件的语句,以noresetlogs方式创建控制文件
E.recover database恢复数据库,恢复完后通过alterdatabase open打开数据库
F.重建temp表空间:altertablespace temp add tempfile '/path/temp01.dbf' reuse;
2.3.5通过trace备份控制文件进行完全恢复演示
oracle数据库提供了多种对控制文件的备份方式:rman、alterdatabase backup controlfile to trace、alter databasebackup controlfile to filename 这里只演示在线损坏时通过alter database backup controlfile to filename 的恢复,因为通过trace备份的恢复演示在“2.3.4通过rman备份控制文件进行不完全恢复演示”章节已经写了。
sql>selectopen_modefromv$database; OPEN_MODE ---------------------------------------- READWRITE sql>!rmcontrol01.ctlcontrol02.ctl--这种情况主要是数据库还在运行状态,手贱误删的恢复 sql>alterdatabasebackupcontrolfileto'/u/app/oracle/oradata/racdg/control01.ctl.bak';--备份成二进制文件 Databasealtered. sql>shutdownabort; ORACLEinstanceshutdown. sql>!cpcontrol01.ctl.bakcontrol01.ctl�C直接拷贝使用 sql>!cpcontrol01.ctl.bakcontrol02.ctl sql>startupmount;--启动到mount状态 ORACLEinstancestarted. TotalSystemGlobalArea830930944bytes FixedSize2257800bytes VariableSize536874104bytes DatabaseBuffers285212672bytes RedoBuffers6586368bytes Databasemounted. sql>selecta.group#,v$logfilebwherea.group#=b.group#; GROUP#SEQUENCE#ARCHIVSTATUSMEMBER --------------------------------------------------------------------------------- 11NOCURRENT/u/app/oracle/oradata/racdg/redo01.log 30YESUNUSED/u/app/oracle/oradata/racdg/redo03.log 20YESUNUSED/u/app/oracle/oradata/racdg/redo02.log sql>recoverdatabaseusingbackupcontrolfileuntilcancel; ORA-00279:change932699generatedat10/31/201719:25:50neededforthread1 ORA-00289:suggestion:/u/app/oracle/oradata/arch/1_1_958850748.dbf ORA-00280:change932699forthread1isinsequence#1 Specifylog:{<RET>=suggested|filename|AUTO|CANCEL} /u/app/oracle/oradata/racdg/redo01.log�C应用redo文件 Logapplied. Mediarecoverycomplete. sql>alterdatabaSEOpenresetlogs;--以resetlogs的方式开启数据库 Databasealtered.
2.3.6通过trace备份控制文件进行不完全恢复思路
A.备份控制文件到trace:alterdatabase backup controlfile to trace as '/path/controlfile.sql';
B.shutdown abort关闭数据库后,startupnomount启动数据库到nomount状态
C. 若丢失redo文件,归档未丢失:
使用备份到trace里创建控制文件的语句,以resetlogs方式创建控制文件
alter database mount;启动数据库mount状态
若未归档的redo文件可用:直接recover database,选用未归档的redo应用,alter database open resetlogs方式打开数据库
若未归档的redo文件不可用:设置隐含参数_allow_resetlogs_corruption=true跳过一致性检查,alterdatabase open resetlogs方式打开数据库
D. 若丢失归档文件,redo未丢失:
使用备份到trace里创建控制文件的语句,以resetlogs方式创建控制文件
alter database mount;启动数据库mount状态
recover database using backup controlfileuntil cancel; 应用redo文件
alter database open resetlogs; 以resetlogs的方式打开数据库
若备份控制文件之后,数据库结构发生了变化,如新增了表空间或数据文件,需要进行不完全恢复
步骤与若丢失归档文件,redo未丢失的恢复步骤一样,主要是以resetlogs方式创建控制文件
F.重建temp表空间:altertablespace temp add tempfile '/path/temp01.dbf' reuse;
2.3.7通过trace备份控制文件进行不完全恢复演示
请参照“2.3.4通过rman备份控制文件进行不完全恢复演示”,主要注意以下几点:
A.trace备份的控制文件并不是实时的备份,可能不是最新的,备份之后数据库结构可能发生了变化
B.对于此类恢复一定需要谨慎,恢复完之后马上做个全备,尽量将数据丢失降低到最小。
2.4所有的控制文件损坏,无备份场景
2.4.1通过手工重建控制文件进行恢复(noresetlogs)思路
A.shutdown abort关闭数据库后,startupnomount启动数据库到nomount状态
B.手工构造控制文件,以noresetlogs方式
C. alter database mount;启动数据库到mount状态
D. recover database using backupcontrolfile until cancel; 应用归档文件
E. 再执行recover databaseusing backup controlfile; 应用未归档的redo文件
F. alter database open resetlogs; 以resetlogs的方式打开数据库
2.4.2通过手工重建控制文件进行恢复(resetlogs)思路
A.shutdown abort关闭数据库后,startupnomount启动数据库到nomount状态
B.手工构造控制文件,以resetlogs方式
C. alter database mount;启动数据库到mount状态
D. recover database using backupcontrolfile until cancel; 应用归档文件(不考虑归档文件丢失)
E. 再执行recover databaseusing backup controlfile; 应用未归档的redo文件(不考虑redo文件丢失)
F. alter database open resetlogs; 以resetlogs的方式打开数据库
2.4.3通过手工重建控制文件进行恢复(resetlogs)演示
这里不作非常具体的演示了,前面的章节已经演示过了,就说明一下需要注意的几点:
CREATECONTROLFILEREUSEDATABASE"RACDG"RESETLOGSARCHIVELOG MAXLOGFILES16 MAXLOGMEMBERS3 MAXDATAFILES100 MAXINSTANCES8 MAXLOGHISTORY292 LOGFILE GROUP1'/u/app/oracle/oradata/racdg/redo01.log'SIZE50MBLOCKSIZE512,'/u/app/oracle/oradata/racdg/users01.dbf','/u/app/oracle/oradata/racdg/t_del_arch01.dbf' CHARACTERSETWE8MSWIN1252;
一定要都存放文件的路径下去ls �Cltr列一下有哪些文件,千万不要把某个文件漏了。
B. 手动构建控制文件是存在一定的数据丢失风险的,一定得细心,细心,再细心。
2.4.4通过SNAPSHOTCONTROLFILE文件进行恢复思路
A.shutdown abort关闭数据库后,startupnomount启动数据库到nomount状态
B.直接拷贝snapshot controlfile成control file或通过rman恢复:restore controlfile from '$ORACLE_HOME/dbs/snapcf_@.f';
C. alter database mount;启动数据库到mount状态
D. recover database using backupcontrolfile until cancel; 应用归档文件(不考虑归档文件丢失)
E. 再执行recover databaseusing backup controlfile; 应用未归档的redo文件(不考虑redo文件丢失)
F. alter database open resetlogs; 以resetlogs的方式打开数据库
2.4.5通过SNAPSHOTCONTROLFILE文件进行恢复演示
RMAN>showsnapshotcontrolfilename;--查看快照控制文件配置 usingtargetdatabasecontrolfileinsteadofrecoverycatalog RMANconfigurationparametersfordatabasewithdb_unique_nameRACDGare: CONFIGURESNAPSHOTCONTROLFILENAMETO'/u/app/oracle/product/11.2.0/db_1/dbs/snapcf_racdg.f';#default --如果是RAC,一般建议将该配置文件配置在ASM或ACFS等共享存储上。 sql>!rmcontrol01.ctlcontrol02.ctl--模拟控制文件丢失 sql>shutdownabort;--强制关闭数据库 ORACLEinstanceshutdown. sql>startupnomount;--启动数据库到mount状态 ORACLEinstancestarted. sql>!cp/u/app/oracle/product/11.2.0/db_1/dbs/snapcf_racdg.fcontrol01.ctl�C直接拷贝快照控制文件 sql>!cp/u/app/oracle/product/11.2.0/db_1/dbs/snapcf_racdg.fcontrol02.ctl sql>!ls-ltrcontrol*.ctl -rw-r-----1oracleoinstall9748480Nov118:48control01.ctl -rw-r-----1oracleoinstall9748480Nov118:48control02.ctl --或者使用RMAN进行恢复:restorecontrolfilefrom‘/u/app/oracle/product/11.2.0/db_1/dbs/snapcf_racdg.f’; sql>alterdatabasemount;--启动数据库到mount状态 Databasealtered. sql>recoverdatabaseusingbackupcontrolfileuntilcancel;--应该归档文件 ORA-00279:change948557generatedat10/31/201722:00:44neededforthread1 ORA-00289:suggestion:/u/app/oracle/oradata/arch/1_2_958851405.dbf ORA-00280:change948557forthread1isinsequence#2 Specifylog:{<RET>=suggested|filename|AUTO|CANCEL} auto ORA-00308:cannotopenarchivedlog'/u/app/oracle/oradata/arch/1_4_958851405.dbf' ORA-27037:unabletoobtainfilestatus Linux-x86_64Error:2:Nosuchfileordirectory Additionalinformation:3 ORA-00308:cannotopenarchivedlog'/u/app/oracle/oradata/arch/1_4_958851405.dbf' ORA-27037:unabletoobtainfilestatus Linux-x86_64Error:2:Nosuchfileordirectory Additionalinformation:3 ORA-01547:warning:RECOVERsucceededbutOPENRESETLOGSwouldgeterrorbelow ORA-01194:file1needsmorerecoverytobeconsistent ORA-01110:datafile1:'/u/app/oracle/oradata/racdg/system01.dbf' sql>selecta.group#,v$logfilebwherea.group#=b.group#; GROUP#SEQUENCE#ARCHIVSTATUSMEMBER ---------------------------------------------------------------------------------------------- 11YESINACTIVE/u/app/oracle/oradata/racdg/redo01.log 30YESUNUSED/u/app/oracle/oradata/racdg/redo03.log 22NOCURRENT/u/app/oracle/oradata/racdg/redo02.log sql>recoverdatabaseusingbackupcontrolfileuntilcancel;--应用redo文件 ORA-00279:change948625generatedat11/01/201718:41:13neededforthread1 ORA-00289:suggestion:/u/app/oracle/oradata/arch/1_4_958851405.dbf ORA-00280:change948625forthread1isinsequence#4 Specifylog:{<RET>=suggested|filename|AUTO|CANCEL} /u/app/oracle/oradata/racdg/redo01.log Logapplied. Mediarecoverycomplete. sql>alterdatabaSEOpenresetlogs;--以resetlogs的方式开启数据库 Databasealtered.
总结:
1、从上可以说是涉及到各个场景控制文件的损坏恢复,相对是比较全面的,但生产环境下的恢复情况要比我们预想的复杂的多,应根据各种情况,尽量将损失降低到最小。
2、还有个在linux环境未关库情况下,造成控制文件误删,可通过/proc进程号恢复,这边就不做介绍了。
3、最后得强调一下,有效的备份重于一切,对生产环境存敬畏之心,千万不要存侥幸心理,墨菲定律就在我们身边。