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 其中一个控制文件损坏恢复演示

  1. sql>showparametercontrol_files
  2.  
  3. NAMETYPEVALUE
  4. ----------------------------------------------------------------------------------------
  5. control_filesstring/u/app/oracle/oradata/racdg/control01.ctl,/u/app/oracle/ora
  6. data/racdg/control02.ctl
  7. sql>!mv/u/app/oracle/oradata/racdg/control02.ctl/u/app/oracle/oradata/racdg/control02.ctl.bak
  8.  
  9. sql>shutdownimmediate;--无正常关闭数据库,需要abort强制关闭
  10. ORA-00210:cannotopenthespecifiedcontrolfile
  11. ORA-00202:controlfile:'/u/app/oracle/oradata/racdg/control02.ctl'
  12. ORA-27041:unabletoopenfile
  13. Linux-x86_64Error:2:Nosuchfileordirectory
  14. Additionalinformation:3
  15. sql>shutdownabort;--只能shutdownabort强制关闭,建议先altersystemcheckpoint之后再关闭
  16. ORACLEinstanceshutdown.
  17. sql>startup;--启动数据库
  18. ORACLEinstancestarted.
  19. ORA-00205:errorinidentifyingcontrolfile,checkalertlogformoreinfo--启动报错,找不到指定的控制文件,在告警日志文件alert_sid.log中可以看到如下报错:
  20. ORA-00210:cannotopenthespecifiedcontrolfile
  21. ORA-00202:controlfile:'/u/app/oracle/oradata/racdg/control02.ctl'
  22.  
  23. sql>!pwd
  24. /u/app/oracle/oradata/racdg
  25.  
  26. sql>!cpcontrol01.ctlcontrol02.ctl
  27.  
  28. 或者:
  29. sql>altersystemsetcontrol_files=’/u/app/oracle/oradata/racdg/control01.ctlscope=both;--不建议,因为这样一来就只剩一份控制文件了,起不到冗余作用,再此次发生丢失,恢复就变得麻烦了。
  30.  
  31. sql>alterdatabasemount;
  32.  
  33. Databasealtered.


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

  1. sql>showparametercontrol_files;
  2. NAMETYPEVALUE
  3. -----------------------------------------------------------------------------
  4. control_filesstring+DATA/racdb/controlfile/current.256.935676497,+DATA/racdb/c
  5. ontrolfile/current.478.957977179
  6.  
  7. sql>shutdownabort;--这里我是为了演示才直接关闭数据的,因为在线情况下asm文件是不能删除
  8. ORACLEinstanceshutdown.
  9.  
  10. sql>!su-grid-c"asmcmd-prm+DATA/racdb/controlfile/current.478.957977179"
  11. Password:
  12.  
  13. sql>startupnomount;--将数据库启动到nomount状态
  14. ORACLEinstancestarted.
  15.  
  16. sql>!rmantarget/--这里使用rman来恢复,当然使用之前的两种方法拷贝和去除也是可以的
  17.  
  18. RecoveryManager:Release11.2.0.4.0-ProductiononSatOct2116:53:152017
  19.  
  20. Copyright(c)1982,2011,Oracleand/oritsaffiliates.Allrightsreserved.
  21.  
  22. connectedtotargetdatabase:RACDB(notmounted)
  23.  
  24. RMAN>restorecontrolfilefrom'+DATA/racdb/controlfile/current.256.935676497';--其实这里就是拷贝的方式
  25.  
  26. Startingrestoreat2017/10/2116:54:18
  27. usingtargetdatabasecontrolfileinsteadofrecoverycatalog
  28. allocatedchannel:ORA_DISK_1
  29. channelORA_DISK_1:SID=143instance=racdb1devicetype=DISK
  30.  
  31. channelORA_DISK_1:copiedcontrolfilecopy
  32. outputfilename=+DATA/racdb/controlfile/current.256.935676497
  33. outputfilename=+DATA/racdb/controlfile/current.478.957977659
  34. Finishedrestoreat2017/10/2116:54:22
  35.  
  36. RMAN>sql'alterdatabasemount';
  37.  
  38. sqlstatement:alterdatabasemount
  39. 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备份控制文件进行完全恢复演示

  1. sql>showparametercontrol_files;
  2. NAMETYPEVALUE
  3. ----------------------------------------------------------------------------------------
  4. control_filesstring/u/app/oracle/oradata/racdg/control01.ctl,/u/app/oracle/ora
  5. data/racdg/control02.ctl,/u/app/oracle/oradata/racdg/control03
  6. .ctl
  7. sql>!rmcontrol01.ctlcontrol02.ctlcontrol03.ctl--删除所有的控制文件,模拟控制文件丢失
  8.  
  9. sql>shutdownabort;--强制关闭数据库
  10. ORACLEinstanceshutdown.
  11. sql>startup;--启动数据到nomount状态
  12. ORACLEinstancestarted.
  13.  
  14. ORA-00205:errorinidentifyingcontrolfile,checkalertlogformoreinfo--报错,同时查看告警日志,会发现所有控制文件都已经丢失。
  15.  
  16. sql>!rmantarget/--此前有做过RMAN控制文件备份,使用rman进行恢复
  17.  
  18. RecoveryManager:Release11.2.0.4.0-ProductiononSatOct2117:24:112017
  19.  
  20. Copyright(c)1982,Oracleand/oritsaffiliates.Allrightsreserved.
  21.  
  22. connectedtotargetdatabase:RACDG(notmounted)
  23.  
  24. RMAN>restorecontrolfilefrom'/u/app/oracle/zwdir/RACDG_20171021_0fshj32i_1_1.ctl';--恢复控制文件
  25.  
  26. Startingrestoreat2017/10/2117:24:57
  27. usingtargetdatabasecontrolfileinsteadofrecoverycatalog
  28. allocatedchannel:ORA_DISK_1
  29. channelORA_DISK_1:SID=135devicetype=DISK
  30.  
  31. channelORA_DISK_1:restoringcontrolfile
  32. channelORA_DISK_1:restorecomplete,elapsedtime:00:00:03
  33. outputfilename=/u/app/oracle/oradata/racdg/control01.ctl
  34. outputfilename=/u/app/oracle/oradata/racdg/control02.ctl
  35. outputfilename=/u/app/oracle/oradata/racdg/control03.ctl
  36. Finishedrestoreat2017/10/2117:25:01
  37.  
  38. RMAN>sql'alterdatabasemount';-将数据库启动到mount状态
  39.  
  40. sqlstatement:alterdatabasemount
  41. releasedchannel:ORA_DISK_1
  42.  
  43. RMAN>exit
  44.  
  45. RecoveryManagercomplete.
  46.  
  47. sql>recoverdatabaseusingbackupcontrolfileuntilcancel;
  48. ORA-00279:change1041001generatedat10/21/201716:04:25neededforthread1
  49. ORA-00289:suggestion:/u/app/oracle/oradata/arch/1_6_957480185.dbf
  50. ORA-00280:change1041001forthread1isinsequence#6
  51.  
  52. Specifylog:{<RET>=suggested|filename|AUTO|CANCEL}
  53. auto
  54. ORA-00279:change1041011generatedat10/21/201716:20:36neededforthread1
  55. ORA-00289:suggestion:/u/app/oracle/oradata/arch/1_7_957480185.dbf
  56. ORA-00280:change1041011forthread1isinsequence#7
  57. ORA-00278:logfile'/u/app/oracle/oradata/arch/1_6_957480185.dbf'nolongerneededforthisrecovery
  58.  
  59. ORA-00279:change1041019generatedat10/21/201716:20:36neededforthread1
  60. ORA-00289:suggestion:/u/app/oracle/oradata/arch/1_8_957480185.dbf
  61. ORA-00280:change1041019forthread1isinsequence#8
  62. ORA-00278:logfile'/u/app/oracle/oradata/arch/1_7_957480185.dbf'nolongerneededforthisrecovery
  63.  
  64. ORA-00308:cannotopenarchivedlog'/u/app/oracle/oradata/arch/1_8_957480185.dbf'
  65. ORA-27037:unabletoobtainfilestatus--缺少序号为8的归档,这是因为redo还存在归档未切换
  66. Linux-x86_64Error:2:Nosuchfileordirectory
  67. Additionalinformation:3
  68.  
  69. ORA-01547:warning:RECOVERsucceededbutOPENRESETLOGSwouldgeterrorbelow
  70. ORA-01194:file1needsmorerecoverytobeconsistent
  71. ORA-01110:datafile1:'/u/app/oracle/oradata/racdg/system01.dbf'
  72.  
  73. sql>selecta.group#,a.sequence#,a.archived,a.status,b.memberfromv$loga,v$logfilebwherea.group#=b.group#;
  74.  
  75. GROUP#SEQUENCE#ARCHIVSTATUSMEMBER
  76. --------------------------------------------------------------------------------------------------------------------
  77. 14YESINACTIVE/u/app/oracle/oradata/racdg/redo01.log
  78. 36NOCURRENT/u/app/oracle/oradata/racdg/redo03.log--当前未归档的redo文件
  79. 25YESINACTIVE/u/app/oracle/oradata/racdg/redo02.log
  80.  
  81. sql>recoverdatabaseusingbackupcontrolfile;--再次执行,应用未归档的redo文件
  82. ORA-00279:change1041019generatedat10/21/201716:20:36neededforthread1
  83. ORA-00289:suggestion:/u/app/oracle/oradata/arch/1_8_957480185.dbf
  84. ORA-00280:change1041019forthread1isinsequence#8--这里看到未归档的redo文件,归档序号为6,而这里需要恢复序列为8的归档,所以应该是应用/u/app/oracle/oradata/racdg/redo02.log这个redo文件
  85.  
  86. Specifylog:{<RET>=suggested|filename|AUTO|CANCEL}
  87. /u/app/oracle/oradata/racdg/redo02.log
  88. Logapplied.
  89. Mediarecoverycomplete.
  90.  
  91. sql>alterdatabaSEOpenresetlogs;--以resetlogs的方式打开数据库
  92.  
  93. 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文件恢复”

  1. [oracle@iscsi-asmzwdir]$rmantarget/
  2.  
  3. RMAN>backupcurrentcontrolfileformat'/u/app/oracle/zwdir/use_this_%U.ctl'tag='ctl';--备份当前的控制文件
  4.  
  5. Startingbackupat2017/10/2917:03:31
  6. usingtargetdatabasecontrolfileinsteadofrecoverycatalog
  7. piecehandle=/u/app/oracle/zwdir/use_this_08si88j3_1_1.ctltag=CTLcomment=NONE
  8. channelORA_DISK_1:backupsetcomplete,elapsedtime:00:00:01
  9. Finishedbackupat2017/10/2917:03:33
  10.  
  11. [oracle@iscsi-asmracdg]$sqlplus/assysdba
  12.  
  13. sql>createtablespacet_del_archdatafile'/u/app/oracle/oradata/racdg/t_del_arch01.dbf'size20m;--新增表空间
  14.  
  15. Tablespacecreated.
  16.  
  17. sql>createusert_archidentifiedbypassworddefaulttablespacet_del_arch;--新建用户
  18.  
  19. Usercreated.
  20.  
  21. sql>grantresource,connecttot_arch;--授权
  22.  
  23. Grantsucceeded.
  24.  
  25. sql>altersystemswitchlogfile;--切换归档日志
  26.  
  27. Systemaltered.
  28.  
  29. sql>createtablet_arch.t1asselect*fromdba_objectswhererownum<1000;-新建表,并插入数据
  30.  
  31. Tablecreated.
  32.  
  33. sql>altersystemswitchlogfile;--切换归档日志
  34.  
  35. Systemaltered.
  36.  
  37. sql>selectcount(*)fromt_arch.t1;
  38.  
  39. COUNT(*)
  40. ----------
  41. 999
  42.  
  43. sql>insertintot_arch.t1select*fromt_arch.t1;--新增数据
  44.  
  45. 999rowscreated.
  46.  
  47. sql>commit;
  48.  
  49. Commitcomplete.
  50.  
  51. sql>altersystemswitchlogfile;--切换日志
  52.  
  53. Systemaltered.
  54.  
  55. sql>selectcount(*)fromt_arch.t1;--记录当前的数据,用作恢复的数据对比
  56.  
  57. COUNT(*)
  58. ----------
  59. 1998
  60.  
  61. sql>archiveloglist;--当前归档的序号
  62. DatabaselogmodeArchiveMode
  63. AutomaticarchivalEnabled
  64. Archivedestination/u/app/oracle/oradata/arch
  65. Oldestonlinelogsequence5
  66. Nextlogsequencetoarchive7
  67. Currentlogsequence7
  68.  
  69. sql>shutdownabort;--关闭数据库
  70. ORACLEinstanceshutdown.
  71. sql>!rmcontrol01.ctlcontrol02.ctl--模拟控制文件丢失
  72.  
  73. sql>!mv/u/app/oracle/oradata/arch/*.dbf/u/app/oracle/oradata/arch/tmp--模拟归档文件全部丢失
  74.  
  75. sql>startupnomount;
  76. ORACLEinstancestarted.
  77.  
  78. sql>!rmantarget/
  79.  
  80. RecoveryManager:Release11.2.0.4.0-ProductiononSunOct2917:19:332017
  81.  
  82. Copyright(c)1982,Oracleand/oritsaffiliates.Allrightsreserved.
  83.  
  84. connectedtotargetdatabase:RACDG(notmounted)
  85.  
  86. RMAN>restorecontrolfilefrom'/u/app/oracle/zwdir/use_this_08si88j3_1_1.ctl';--通过旧备份控制文件进行恢复
  87.  
  88. Startingrestoreat2017/10/2917:19:44
  89. usingtargetdatabasecontrolfileinsteadofrecoverycatalog
  90. allocatedchannel:ORA_DISK_1
  91. channelORA_DISK_1:SID=10devicetype=DISK
  92. channelORA_DISK_1:restoringcontrolfile
  93. channelORA_DISK_1:restorecomplete,elapsedtime:00:00:01
  94. outputfilename=/u/app/oracle/oradata/racdg/control01.ctl
  95. outputfilename=/u/app/oracle/oradata/racdg/control02.ctl
  96. Finishedrestoreat2017/10/2917:19:46
  97.  
  98. RMAN>exit
  99.  
  100. RecoveryManagercomplete.
  101.  
  102. sql>alterdatabasemount;
  103.  
  104. Databasealtered.
  105.  
  106. sql>alterdatabasebackupcontrolfiletotraceas'/u/app/oracle/zwdir/controlfile.sql';
  107.  
  108. Databasealtered.--此时归档文件已经丢失了,无法通过应用归档文件进行恢复,所以通过trc新建控制文件的方式进行恢复。
  109.  
  110. sql>shutdownabort;--关闭数据库
  111. ORACLEinstanceshutdown.
  112. sql>STARTUPNOMOUNT--启动到nomount状态
  113. ORACLEinstancestarted.
  114.  
  115. sql>CREATECONTROLFILEREUSEDATABASE"RACDG"NORESETLOGSARCHIVELOG
  116. MAXLOGFILES16
  117. MAXLOGMEMBERS3
  118. MAXDATAFILES100
  119. MAXINSTANCES8
  120. MAXLOGHISTORY292
  121. LOGFILE
  122. 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
  123. --STANDBYLOGFILE
  124. DATAFILE
  125. '/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'
  126. CHARACTERSETWE8MSWIN1252
  127. ;
  128.  
  129. --以上新建控制文件内容就是通过/u/app/oracle/zwdir/controlfile.sql里面的记录来进行新建的,里面共有两种方式,一种是noresetlogs,另一种是resetlogs的方式。这里因为redo文件是没有丢失的,所以使用nosesetlogs的方式。
  130.  
  131. Controlfilecreated.
  132.  
  133. sql>selectb.sequence#,a.member,b.statusfromv$logfilea,v$logbwherea.group#=b.group#;--查询redo信息
  134.  
  135. SEQUENCE#MEMBERSTATUS
  136. ---------------------------------------------------------------------------------------
  137. 7/u/app/oracle/oradata/racdg/redo01.logCURRENT
  138. 5/u/app/oracle/oradata/racdg/redo02.logINACTIVE
  139. 6/u/app/oracle/oradata/racdg/redo03.logINACTIVE
  140.  
  141. sql>selectfile#,name,statusfromv$datafile;--查询数据文件信息,此时数据文件都是需要恢复
  142.  
  143. FILE#NAMESTATUS
  144. ---------------------------------------------------------------------
  145. 1/u/app/oracle/oradata/racdg/system01.dbfSYSTEM
  146. 2/u/app/oracle/oradata/racdg/sysaux01.dbfRECOVER
  147. 3/u/app/oracle/oradata/racdg/undotbs01.dbfRECOVER
  148. 4/u/app/oracle/oradata/racdg/users01.dbfRECOVER
  149.  
  150. sql>recoverdatabaseusingbackupcontrolfileuntilcancel;--恢复数据库,应用redo日志
  151. ORA-00279:change932267generatedat10/29/201717:07:56neededforthread1
  152. ORA-00289:suggestion:/u/app/oracle/oradata/arch/1_6_958668721.dbf
  153. ORA-00280:change932267forthread1isinsequence#6
  154.  
  155. Specifylog:{<RET>=suggested|filename|AUTO|CANCEL}
  156. /u/app/oracle/oradata/racdg/redo03.log
  157. ORA-00279:change932300generatedat10/29/201717:09:10neededforthread1
  158. ORA-00289:suggestion:/u/app/oracle/oradata/arch/1_7_958668721.dbf
  159. ORA-00280:change932300forthread1isinsequence#7
  160. ORA-00278:logfile'/u/app/oracle/oradata/racdg/redo03.log'nolongerneededforthisrecovery
  161.  
  162. Specifylog:{<RET>=suggested|filename|AUTO|CANCEL}
  163. /u/app/oracle/oradata/racdg/redo01.log
  164. Logapplied.
  165. Mediarecoverycomplete.
  166.  
  167. sql>alterdatabaSEOpenresetlogs;--以resetlogs的方式打开数据库
  168.  
  169. Databasealtered.
  170.  
  171. sql>selectfile#,statusfromv$datafile;--查看数据文件的状态,备份控制文件之后的表空间对应的数据文件需要进一步恢复。
  172. FILE#NAMESTATUS
  173. ----------------------------------------------------------------------------
  174. 1/u/app/oracle/oradata/racdg/system01.dbfSYSTEM
  175. 2/u/app/oracle/oradata/racdg/sysaux01.dbfONLINE
  176. 3/u/app/oracle/oradata/racdg/undotbs01.dbfONLINE
  177. 4/u/app/oracle/oradata/racdg/users01.dbfONLINE
  178. 5/u/app/oracle/product/11.2.0/db_1/dbs/MISSING00005RECOVER
  179.  
  180. sql>alterdatabasedatafile5offline;--先将数据文件offline
  181.  
  182. Databasealtered.
  183.  
  184. sql>alterdatabaserenamefile'/u/app/oracle/product/11.2.0/db_1/dbs/MISSING00005'to'/u/app/oracle/oradata/racdg/t_del_arch01.dbf';--重命名数据文件
  185.  
  186. Databasealtered.
  187.  
  188. sql>altertablespacet_del_archonline;---尝试将表空间online,报错
  189. altertablespacet_del_archonline
  190. *
  191. ERRORatline1:
  192. ORA-01190:controlfileordatafile5isfrombeforethelastRESETLOGS
  193. ORA-01110:datafile5:'/u/app/oracle/oradata/racdg/t_del_arch01.dbf'
  194.  
  195. sql>altersystemset"_allow_resetlogs_corruption"=truescope=spfile;修改参数,忽略SCN一致性校验
  196.  
  197. Systemaltered.
  198.  
  199. sql>startupforce;--再将数据库重新启动
  200. ORACLEinstancestarted.
  201.  
  202. TotalSystemGlobalArea830930944bytes
  203. FixedSize2257800bytes
  204. VariableSize536874104bytes
  205. DatabaseBuffers285212672bytes
  206. RedoBuffers6586368bytes
  207. Databasemounted.
  208. DatabaSEOpened.
  209.  
  210. sql>selectts#,file#,status,checkpoint_change#fromv$datafile;--查询数据文件的情况
  211.  
  212. TS#FILE#NAMESTATUSCHECKPOINT_CHANGE#
  213. -------------------------------------------------------------------------------------------------
  214. 01/u/app/oracle/oradata/racdg/system01.dbfSYSTEM953040
  215. 12/u/app/oracle/oradata/racdg/sysaux01.dbfONLINE953040
  216. 23/u/app/oracle/oradata/racdg/undotbs01.dbfONLINE953040
  217. 44/u/app/oracle/oradata/racdg/users01.dbfONLINE953040
  218. 65/u/app/oracle/oradata/racdg/t_del_arch01.dbfRECOVER0
  219.  
  220. sql>altersessionsetevents'immediatetracenameadjust_scnlevel1';--通过设置adjust_scn使数据文件的CHECKPOINT_CHANGE#一致
  221.  
  222. Sessionaltered.
  223.  
  224. sql>shutdownimmediate;
  225. Databaseclosed.
  226. Databasedismounted.
  227. ORACLEinstanceshutdown.
  228. sql>startupmount;--启动到mount状态
  229. ORACLEinstancestarted.
  230.  
  231. TotalSystemGlobalArea830930944bytes
  232. FixedSize2257800bytes
  233. VariableSize536874104bytes
  234. DatabaseBuffers285212672bytes
  235. RedoBuffers6586368bytes
  236. Databasemounted.
  237. sql>recoveruntilcancel;--恢复数据库,注意这里不是usingcontrolfile的方式
  238. Mediarecoverycomplete.
  239.  
  240. sql>alterdatabasedatafile2,3,4,5online;---将所有的数据文件online,记得千万不用漏了
  241.  
  242. Databasealtered.
  243.  
  244. sql>alterdatabaSEOpenresetlogs;--以resetlogs的方式打开数据库
  245.  
  246. Databasealtered.
  247.  
  248. sql>selectts#,checkpoint_change#fromv$datafile;--查询数据文件的情况
  249.  
  250. TS#FILE#NAMESTATUSCHECKPOINT_CHANGE#
  251. -------------------------------------------------------------------------------------------------
  252. 01/u/app/oracle/oradata/racdg/system01.dbfSYSTEM953040
  253. 12/u/app/oracle/oradata/racdg/sysaux01.dbfONLINE953040
  254. 23/u/app/oracle/oradata/racdg/undotbs01.dbfONLINE953040
  255. 44/u/app/oracle/oradata/racdg/users01.dbfONLINE953040
  256. 65/u/app/oracle/oradata/racdg/t_del_arch01.dbfONLINE953040
  257.  
  258. sql>selectcount(*)fromt_arch.t1;--对比数据,发现存在数据丢失,出现这种情况,只能把损失降到最小
  259.  
  260. COUNT(*)
  261. ----------
  262. 999
  263.  
  264. sql>altertablespacetempaddtempfile'/u/app/oracle/oradata/racdg/temp01.dbf'reuse;--重建temp表空间
  265.  
  266. 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备份控制文件进行不完全恢复演示”章节已经写了。

  1. sql>selectopen_modefromv$database;
  2.  
  3. OPEN_MODE
  4. ----------------------------------------
  5. READWRITE
  6.  
  7. sql>!rmcontrol01.ctlcontrol02.ctl--这种情况主要是数据库还在运行状态,手贱误删的恢复
  8.  
  9. sql>alterdatabasebackupcontrolfileto'/u/app/oracle/oradata/racdg/control01.ctl.bak';--备份成二进制文件
  10.  
  11. Databasealtered.
  12.  
  13. sql>shutdownabort;
  14. ORACLEinstanceshutdown.
  15.  
  16. sql>!cpcontrol01.ctl.bakcontrol01.ctlC直接拷贝使用
  17.  
  18. sql>!cpcontrol01.ctl.bakcontrol02.ctl
  19.  
  20. sql>startupmount;--启动到mount状态
  21. ORACLEinstancestarted.
  22.  
  23. TotalSystemGlobalArea830930944bytes
  24. FixedSize2257800bytes
  25. VariableSize536874104bytes
  26. DatabaseBuffers285212672bytes
  27. RedoBuffers6586368bytes
  28. Databasemounted.
  29.  
  30. sql>selecta.group#,v$logfilebwherea.group#=b.group#;
  31.  
  32. GROUP#SEQUENCE#ARCHIVSTATUSMEMBER
  33. ---------------------------------------------------------------------------------
  34. 11NOCURRENT/u/app/oracle/oradata/racdg/redo01.log
  35. 30YESUNUSED/u/app/oracle/oradata/racdg/redo03.log
  36. 20YESUNUSED/u/app/oracle/oradata/racdg/redo02.log
  37.  
  38. sql>recoverdatabaseusingbackupcontrolfileuntilcancel;
  39. ORA-00279:change932699generatedat10/31/201719:25:50neededforthread1
  40. ORA-00289:suggestion:/u/app/oracle/oradata/arch/1_1_958850748.dbf
  41. ORA-00280:change932699forthread1isinsequence#1
  42.  
  43. Specifylog:{<RET>=suggested|filename|AUTO|CANCEL}
  44. /u/app/oracle/oradata/racdg/redo01.logC应用redo文件
  45. Logapplied.
  46. Mediarecoverycomplete.
  47.  
  48. sql>alterdatabaSEOpenresetlogs;--以resetlogs的方式开启数据库
  49.  
  50. 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. 因为是手动构建,所以在构建的过程中一定要仔细检查数据库清除数据库有多少文件,构建脚本如下:

  1. CREATECONTROLFILEREUSEDATABASE"RACDG"RESETLOGSARCHIVELOG
  2. MAXLOGFILES16
  3. MAXLOGMEMBERS3
  4. MAXDATAFILES100
  5. MAXINSTANCES8
  6. MAXLOGHISTORY292
  7. LOGFILE
  8. 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'
  9. 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文件进行恢复演示

  1. RMAN>showsnapshotcontrolfilename;--查看快照控制文件配置
  2.  
  3. usingtargetdatabasecontrolfileinsteadofrecoverycatalog
  4. RMANconfigurationparametersfordatabasewithdb_unique_nameRACDGare:
  5. CONFIGURESNAPSHOTCONTROLFILENAMETO'/u/app/oracle/product/11.2.0/db_1/dbs/snapcf_racdg.f';#default
  6. --如果是RAC,一般建议将该配置文件配置在ASMACFS等共享存储上。
  7.  
  8. sql>!rmcontrol01.ctlcontrol02.ctl--模拟控制文件丢失
  9.  
  10. sql>shutdownabort;--强制关闭数据库
  11. ORACLEinstanceshutdown.
  12.  
  13. sql>startupnomount;--启动数据库mount状态
  14. ORACLEinstancestarted.
  15.  
  16. sql>!cp/u/app/oracle/product/11.2.0/db_1/dbs/snapcf_racdg.fcontrol01.ctlC直接拷贝快照控制文件
  17.  
  18. sql>!cp/u/app/oracle/product/11.2.0/db_1/dbs/snapcf_racdg.fcontrol02.ctl
  19.  
  20. sql>!ls-ltrcontrol*.ctl
  21. -rw-r-----1oracleoinstall9748480Nov118:48control01.ctl
  22. -rw-r-----1oracleoinstall9748480Nov118:48control02.ctl
  23.  
  24. --或者使用RMAN进行恢复:restorecontrolfilefrom‘/u/app/oracle/product/11.2.0/db_1/dbs/snapcf_racdg.f’;
  25.  
  26. sql>alterdatabasemount;--启动数据库mount状态
  27.  
  28. Databasealtered.
  29.  
  30. sql>recoverdatabaseusingbackupcontrolfileuntilcancel;--应该归档文件
  31. ORA-00279:change948557generatedat10/31/201722:00:44neededforthread1
  32. ORA-00289:suggestion:/u/app/oracle/oradata/arch/1_2_958851405.dbf
  33. ORA-00280:change948557forthread1isinsequence#2
  34.  
  35. Specifylog:{<RET>=suggested|filename|AUTO|CANCEL}
  36. auto
  37. ORA-00308:cannotopenarchivedlog'/u/app/oracle/oradata/arch/1_4_958851405.dbf'
  38. ORA-27037:unabletoobtainfilestatus
  39. Linux-x86_64Error:2:Nosuchfileordirectory
  40. Additionalinformation:3
  41.  
  42. ORA-00308:cannotopenarchivedlog'/u/app/oracle/oradata/arch/1_4_958851405.dbf'
  43. ORA-27037:unabletoobtainfilestatus
  44. Linux-x86_64Error:2:Nosuchfileordirectory
  45. Additionalinformation:3
  46.  
  47. ORA-01547:warning:RECOVERsucceededbutOPENRESETLOGSwouldgeterrorbelow
  48. ORA-01194:file1needsmorerecoverytobeconsistent
  49. ORA-01110:datafile1:'/u/app/oracle/oradata/racdg/system01.dbf'
  50.  
  51. sql>selecta.group#,v$logfilebwherea.group#=b.group#;
  52.  
  53. GROUP#SEQUENCE#ARCHIVSTATUSMEMBER
  54. ----------------------------------------------------------------------------------------------
  55. 11YESINACTIVE/u/app/oracle/oradata/racdg/redo01.log
  56. 30YESUNUSED/u/app/oracle/oradata/racdg/redo03.log
  57. 22NOCURRENT/u/app/oracle/oradata/racdg/redo02.log
  58.  
  59. sql>recoverdatabaseusingbackupcontrolfileuntilcancel;--应用redo文件
  60. ORA-00279:change948625generatedat11/01/201718:41:13neededforthread1
  61. ORA-00289:suggestion:/u/app/oracle/oradata/arch/1_4_958851405.dbf
  62. ORA-00280:change948625forthread1isinsequence#4
  63.  
  64. Specifylog:{<RET>=suggested|filename|AUTO|CANCEL}
  65. /u/app/oracle/oradata/racdg/redo01.log
  66. Logapplied.
  67. Mediarecoverycomplete.
  68. sql>alterdatabaSEOpenresetlogs;--以resetlogs的方式开启数据库
  69.  
  70. Databasealtered.


总结:

1、从上可以说是涉及到各个场景控制文件的损坏恢复,相对是比较全面的,但生产环境下的恢复情况要比我们预想的复杂的多,应根据各种情况,尽量将损失降低到最小。

2、还有个在linux环境未关库情况下,造成控制文件误删,可通过/proc进程号恢复,这边就不做介绍了。

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

猜你在找的Oracle相关文章