在数据库运维中经常会遇到某个数据文件的 SCN 与其他文件的 SCN 不一致(如 offline 后或者异常断电),
如果归档日志被删除了,导致 datafile 不能 recover 的情况,数据库不能打开情况,
这时候我们需要借助 bbed 修改 datafile header 的 scn 与其他 datafile 的 header scn 一致,然后
recover datafile。
【一】问题现象
(1)offline 数据文件后,归档已经被删除;
(2)异常断电时,数据文件头中的 scn 与控制文件中的 scn 不一致;
【二】恢复方法
使用 bbed 工具查看、修改数据文件,该操作风险极大,操作前请备份数据文件!!!
文件头说明:修改数据文件头,需要关注四个偏移量 offset 点,分别为 484、492、140 和 148
a、datafile 的 file header 存储在第一个 block 里(linux 下块从 1 开始,window 下块从 2 开始)
b、Oracle considers four attributes of this data structure when determining if a
datafile is sync with the other data files of the database:(不同 oracle 版本
offset 可能不同)
(1)kscnbas (at offset 484) – SCN of last change to the datafile.
(2)kcvcptim (at offset 492) -Time of the last change to the datafile.
(3)kcvfhcpc (at offset 140) – Checkpoint count.
(4)kcvfhccc (at offset 148) – Unknown, but is always 1 less than thecheckpoint
point count.
Oracle 有 4 个属性来判断 datafile 是否和其他的 datafile 一致,如果都一致,可以正常操作,如果不
一致,那么会报 ORA-01113 错误
BBED 查看方法:
BBED> p kcvfhckp.kcvcpscn.kscnbas
【三】具体恢复过程
3.1 查看当前数据库一些相关信息(恢复时需要关注的一些信息)
col name for a60
col member for a50
set pagesize 20000
set linesize 200
set pause off
set serveroutput on
set feedback on
set echo on
set numformat 999999999999999
spool recovery_info.txt
select file#,name, status,checkpoint_change#,checkpoint_time from v$datafile;
select file#,name, status,checkpoint_change#,checkpoint_time from v$datafile;
select substr(name,1,50), recover, fuzzy, checkpoint_change# from
v$datafile_header;
select GROUP#,member from v$logfile;
select * from v$recover_file;
select distinct status from v$backup;
select hxfil FILENUMBER, fhsta STATUS, fhscn SCN, FHAFS ABSSCN , fhrba_Seq
SEQUENCE from x$kcvfh;
select distinct (fuzzy) from v$datafile_header;
spool off
exit;
评论