场景 |
恢复方法 |
恢复条件 |
|
其中一个控制文件损坏 |
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、最后得强调一下,有效的备份重于一切,对生产环境存敬畏之心,千万不要存侥幸心理,墨菲定律就在我们身边。