oracle数据库恢复系列之控制文件恢复

前端之家收集整理的这篇文章主要介绍了oracle数据库恢复系列之控制文件恢复前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、不同场景控制文件损坏时的恢复方法

场景

恢复方法

恢复条件

其中一个控制文件损坏

1.1 拷贝冗余的控制文件

1、具有多路冗余控制文件镜像
2、其它冗余控制文件没有损坏

1.2 修改control_files参数去除损坏文件

同上、但不推荐该方法进行恢复

所有的控制文件损坏

有备份

2.1 通过rman备份控制文件进行完全恢复

1、通过rman备份了控制文件
2、备份了控制文件之后有连续的归档和redo文件

2.2 通过rman备份控制文件进行不完全恢复

1、通过rman备份了控制文件
2、备份了控制文件之后归档或redo文件丢失

2.3 通过trace备份控制文件进行完全恢复

1、通过trace备份了控制文件
2、备份了控制文件之后有连续的归档和redo文件

2.4 通过trace备份控制文件进行不完全恢复

1、通过trace备份了控制文件
2、备份了控制文件之后归档或redo文件丢失

无备份

2.5 通过手工重建控制文件进行恢复(noresetlogs)

1、无有效的备份控制文件
2、redo文件无丢失和无损坏

2.6 通过手工重建控制文件进行恢复(resetlogs)

1、无有效的备份控制文件
2、redo文件丢失或损坏

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.


使用ASM存放控制文件,其中一个控制文件损坏恢复演示

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.

resetlogsnoresetlogs的区别说明:

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.备份控制文件tracealterdatabase 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数据库提供了多种对控制文件的备份方式:rmanalterdatabase backup controlfile to tracealter 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.备份控制文件tracealterdatabase 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的方式打开数据库

若备份控制文件之后,数据库结构发生了变化,如新增了表空间或数据文件,需要进行不完全恢复

E. 若归档文件redo文件都丢失:

步骤与若丢失归档文件,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)演示

这里不作非常具体的演示了,前面的章节已经演示过了,就说明一下需要注意的几点:

  1. 因为是手动构建,所以在构建的过程中一定要仔细检查数据库清除数据库有多少文件,构建脚本如下:

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 controlfilecontrol 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、最后得强调一下,有效的备份重于一切,对生产环境存敬畏之心,千万不要存侥幸心理,墨菲定律就在我们身边。

猜你在找的Oracle相关文章