- A+
丢失redo分为两种情况的恢复,要根据数据文件头的SCN值和归档日志的最大SCN值比较。
情况一:v$datafile_header.CHECKPOINT_CHANGE# > v$archived_log.Max(NEXT_CHANGE#)
即数据文件头的SCN值大于最后一个归档日志的NEXT_CHANGE#时,说明数据文件已经超前了归档日志,但是落后于redo,redo中的信息已经写入了数据文件,但是没有归档。
在这种情况下丢失redo后,恢复过程比较复杂。
执行步骤如下:
因为数据文件头的SCN值大于了所有归档日志的最大SCN值,并且redo已经丢失, 这样在执行recover的过程中数据文件是没法往后追的,数据库的恢复机制只能向 前追加归档日志,直到追加完所有的归档。
所以必须使用数据文件的备份集先restore,替换原来的数据文件,使得数据文件头 的SCN值小于归档日志的最大SCN 值,这样才能执行recover的过程。
一、确定归档日志的最大SCN值
select name,RESETLOGS_CHANGE#,FIRST_CHANGE#, NEXT_CHANGE# from v$archived_log;
同时确认这批归档对应的incarnation是否能匹配上RMAN > list incarnation
显示的结果集中的current incarnation,即current incarnation.reset_scn= v$archived_log .MaxSCN.RESETLOGS_CHANGE#,这样在recover的过程中才会主 动去追加这批归档日志,直到追加到最大SCN对应的归档日志。
二、restore 数据库until到maxSCN
SQL > startup mount
RMAN > restore database until scn maxSCN;
三、recover数据库until到maxSCN
RMAN > recover database until scn maxSCN;
四、resetlogs方式打开数据库
RMAN > alter database open resetlogs;
五、重建redo组,添加member
情况二:v$datafile_header.CHECKPOINT_CHANGE# < v$archived_log.Max(NEXT_CHANGE#)
即在现有数据文件的基础上直接追加归档日志就可以追加到归档日志的最大SCN值,达到丢失数据最少的状态。
采用重建控制文件的方式来重建redo
resetlogs方式打开数据库重建redo必须要求数据库是不完全恢复,如果只丢失了redo, 其他都正常,此时执行alter database open resetlogs命令会报错,报错信息主要是说 resetlogs选项只能用于不完全恢复。同时无法直接修改控制文件中记录的redo信息, 所以只能通过重建控制文件来重建redo
一、备份控制文件
mount状态备份控制文件
alter database backup controlfile to trace as
' /u01/app/oracle/oradata/CPROD4/controlfile/recreateCtl.ctl';
二、编辑控制文件
gedit /u01/app/oracle/oradata/CPROD4/controlfile/recreateCtl.ctl
最终编辑后的设置参考脚本:recreateCtl.txt
三、打开数据库到nomount状态
SQL > startup nomount
SQL > @/u01/app/oracle/oradata/CPROD4/controlfile/recreateCtl.ctl
完成控制文件的重建,系统自动alter到mount状态
四、recover数据库
RMAN > recover database until scn maxSCN;
五、resetlogs方式打开数据库
RMAN > alter database open resetlogs;
六、重建redo组,添加member
本文由 路远 首发于【路远网(http://www.luyuan.io)】未经允许不得以任何方式转载,违者必将追究法律责任。
- 我的微信
- 这是我的微信扫一扫
- 我的电报
- 这是我的电报扫一扫