在数据库运维中经常会遇到某个数据文件的SCN与其他文件的SCN不一致(如offline后或者异常断电),如果归档日志被删除了,导致datafile不能recover,数据库不能打开情况,这时候我们需要借助bbed修改datafile header的scn与其他datafile的header scn 一致,然后recover datafile。
- 一、问题产生原因
(1)数据文件被offline一段时间后,归档已经被删除不存在了;
(2)异常断电时,数据文件头中的scn与控制文件中的scn不一致;
- 二 、 恢复方法
文件头说明:修改数据文件头,需要关注四个偏移量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工具修改数据文件,该操作风险极大,操作前请备份数据文件!!!
- 三、具体恢复过程
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 name, 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 distinct (fuzzy) from v$datafile_header;
spool off
exit;
3.2 查看控制文件记录的数据文件的SCN信息
set lines 200 pages 500
col name for a60
col checkpoint_change for a20
select file#,name,status,to_char(checkpoint_change#) checkpoint_change
from v$datafile order by 1;
FILE# NAME STATUS CHECKPOINT_CHANGE
---------- -------------------------------------------------------------------------------- -------------- --------------------
1 D:\ORADATA\ORCL\SYSTEM01.DBF SYSTEM 3103652694
2 D:\ORADATA\ORCL\SYSAUX01.DBF ONLINE 3103652694
3 D:\ORADATA\ORCL\UNDOTBS01.DBF ONLINE 3103652694
4 D:\ORADATA\ORCL\USERS01.DBF ONLINE 3103652694
5 D:\ORADATA\ORCL\TS_EXAMPLE.DBF ONLINE 3103652694
6 D:\ORADATA\ORCL\OGGTBS01.DBF ONLINE 3103652694
7 D:\ORADATA\ORCL\REC_TBS01.DBF ONLINE 3103652694
8 D:\ORADATA\ORCL\MRKT.DBF ONLINE 3103652694
3.3 查看数据文件头的SCN信息
set lines 200 pages 500
col name for a60
col checkpoint_change for a20
select file#,name,status,to_char(checkpoint_change#) checkpoint_change
from v$datafile_header order by 1;
FILE# NAME STATUS CHECKPOINT_CHANGE
---------- -------------------------------------------------------------------------------- -------------- --------------------
1 D:\ORADATA\ORCL\SYSTEM01.DBF ONLINE 3103662768
2 D:\ORADATA\ORCL\SYSAUX01.DBF ONLINE 3103662768
3 D:\ORADATA\ORCL\UNDOTBS01.DBF ONLINE 3103323763
4 D:\ORADATA\ORCL\USERS01.DBF ONLINE 3103662768
5 D:\ORADATA\ORCL\TS_EXAMPLE.DBF ONLINE 3103662768
6 D:\ORADATA\ORCL\OGGTBS01.DBF ONLINE 3103662768
7 D:\ORADATA\ORCL\REC_TBS01.DBF ONLINE 3103662768
8 D:\ORADATA\ORCL\MRKT.DBF ONLINE 3103662768
从上面可以看到数据文件3的文件头SCN 3103323763 与 其他文件的文件头SCN 3103662768 不一致,我们需要将它修改成与其他文件一样,也就是将3103323763修改成3103662768
--3103662768 转换成16进制如下:
select trunc(3103662768/power(2,32)) scn_wrap,mod(3103662768,power(2,32)) scn_base,
to_char(trunc(3103662768/power(2,32)),'xxxxxxxxxxxxxxxxxxxxx') scn_wrap16,to_char(mod(3103662768,power(2,32)),'xxxxxxxxxxxxxxxxxxxxx') SCN_BASE16
from dual;
SCN_WRAP SCN_BASE SCN_WRAP16 SCN_BASE16
---------------- ---------------- -------------------------------------------- --------------------------------------------
0 3103662768 0 b8fe22b0
3.4 BBED查看3号数据文件的SCN信息
BBED> set file 3 block 2;
FILE# 3
BLOCK# 2
注意:如果是linux环境,文件头在块1,win os系统中第一个块头存在偏移量无法识别,访问时需要 block +1,所以在块2。
BBED> dump offset 484 count 128;
File: D:\ORADATA\ORCL\UNDOTBS01.DBF (3)
Block: 2 Offsets: 484 to 611 Dba:0x00c00002
------------------------------------------------------------------------
73f6f8b8 00000000 2416a245 01000000 b30b0000 04000000 1000ab0d 02000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
<32 bytes per line>
–注意字节顺序,大小端问题
73f6f8b8 反序后 b8f8f673 >>>> 转换成10进制就是 3103323763 ,这与我们上面看到的datafile_header的scn是一致的。
3.5 BBED修改3号数据文件的SCN信息
需要将3号文件的文件头scn由3103323763修改成3103662768,3103662768 转换成16进制就是 b8fe22b0 反序后就是 b022feb8
BBED> modify /x b022feb8 offset 484
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
File: D:\ORADATA\ORCL\UNDOTBS01.DBF (3)
Block: 2 Offsets: 484 to 611 Dba:0x00c00002
------------------------------------------------------------------------
b022feb8 00000000 2416a245 01000000 b30b0000 04000000 1000ab0d 02000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
<32 bytes per line>
BBED> sum apply
Check value for File 3, Block 2:
current = 0xf3ab, required = 0xf3ab
3.6 再次查看数据文件头的SCN信息
<SQL> set lines 200 pages 500
<SQL> col name for a60
<SQL> col checkpoint_change for a20
<SQL> select file#,name,status,to_char(checkpoint_change#) checkpoint_change
2 from v$datafile_header order by 1;
FILE# NAME STATUS CHECKPOINT_CHANGE
---------- ------------------------------------------------------------ -------------- --------------------
1 D:\ORADATA\ORCL\SYSTEM01.DBF ONLINE 3103662768
2 D:\ORADATA\ORCL\SYSAUX01.DBF ONLINE 3103662768
3 D:\ORADATA\ORCL\UNDOTBS01.DBF ONLINE 3103662768
4 D:\ORADATA\ORCL\USERS01.DBF ONLINE 3103662768
5 D:\ORADATA\ORCL\TS_EXAMPLE.DBF ONLINE 3103662768
6 D:\ORADATA\ORCL\OGGTBS01.DBF ONLINE 3103662768
7 D:\ORADATA\ORCL\REC_TBS01.DBF ONLINE 3103662768
8 D:\ORADATA\ORCL\MRKT.DBF ONLINE 3103662768
3.7 重建控制文件
--生成当前的控制文件
alter database backup controlfile to trace;
select * from v$diag_info;
D:\APP\ADMINISTRATOR\diag\rdbms\orcl\orcl\trace\orcl_ora_36248.trc
--查看orcl_ora_36248.trc文件,找到控制文件重建语句
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS FORCE LOGGING ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 4 'D:\ORADATA\ORCL\REDO04.LOG' SIZE 100M BLOCKSIZE 512,
GROUP 5 'D:\ORADATA\ORCL\REDO05.LOG' SIZE 100M BLOCKSIZE 512,
GROUP 6 'D:\ORADATA\ORCL\REDO06.LOG' SIZE 100M BLOCKSIZE 512
DATAFILE
'D:\ORADATA\ORCL\SYSTEM01.DBF',
'D:\ORADATA\ORCL\SYSAUX01.DBF',
'D:\ORADATA\ORCL\UNDOTBS01.DBF',
'D:\ORADATA\ORCL\USERS01.DBF',
'D:\ORADATA\ORCL\TS_EXAMPLE.DBF',
'D:\ORADATA\ORCL\OGGTBS01.DBF',
'D:\ORADATA\ORCL\REC_TBS01.DBF',
'D:\ORADATA\ORCL\MRKT.DBF'
CHARACTER SET AL32UTF8
;
RECOVER DATABASE USING BACKUP CONTROLFILE;
执行上述语句,进行控制文件的重建。
--查看控制文件头scn
<SQL> set lines 200 pages 500
<SQL> col name for a60
<SQL> col checkpoint_change for a20
<SQL> select file#,name,status,to_char(checkpoint_change#) checkpoint_change
2 from v$datafile order by 1;
FILE# NAME STATUS CHECKPOINT_CHANGE
---------- ------------------------------------------------------------ -------------- --------------------
1 D:\ORADATA\ORCL\SYSTEM01.DBF SYSTEM 3103662768
2 D:\ORADATA\ORCL\SYSAUX01.DBF RECOVER 3103662768
3 D:\ORADATA\ORCL\UNDOTBS01.DBF RECOVER 3103662768
4 D:\ORADATA\ORCL\USERS01.DBF RECOVER 3103662768
5 D:\ORADATA\ORCL\TS_EXAMPLE.DBF RECOVER 3103662768
6 D:\ORADATA\ORCL\OGGTBS01.DBF RECOVER 3103662768
7 D:\ORADATA\ORCL\REC_TBS01.DBF RECOVER 3103662768
8 D:\ORADATA\ORCL\MRKT.DBF RECOVER 3103662768
重建完控制文件后,SCN与文件头的SCN一致。
3.8 使用隐含参数打开数据库
--修改隐含参数
<SQL> alter system set "_allow_resetlogs_corruption"= TRUE scope=spfile;
<SQL> shutdown immediate;
已经卸载数据库。
ORACLE 例程已经关闭。
<SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 3140026368 bytes
Fixed Size 2285360 bytes
Variable Size 2046820560 bytes
Database Buffers 1073741824 bytes
Redo Buffers 17178624 bytes
<SQL> alter database open resetlogs;
数据库已更改。
3.9 数据库打开后的,其他操作步骤
–添加临时文件
ALTER TABLESPACE TEMP ADD TEMPFILE ‘D:\ORADATA\ORCL\TEMP01.DBF’ REUSE;
–去掉隐含参数:
<SQL> alter system set “_allow_resetlogs_corruption”=false scope=spfile;
–重启数据库,生效
<SQL> shutdown immediate;
<SQL> startup;
以上内容转载自网络,原文连接:https://blog.csdn.net/zhirongsu/article/details/139202168
使用过程中的几个小波折:
1、问题数据库使用的是Oracle11G,本身未安装BBED,windows版本的BBED独立运行程序网上可以下载
2、在运行BBED时,filelist不知道怎么设置,最后使用的是 指定filename方式
3、blocksize的缺省大小设置是2048,运行dump指令后查看的数据都是0,后来改成8196 问题解决
BBED> show
FILE# 1
BLOCK# 1
OFFSET 0
DBA 0x00400001(4194305 1,1)
FILENAME /u01/app/oracle/oradata/sex0/system01.dbf
BIFILE bifile.bbd
LISTFILE /u01/filelist.txt
BLOCKSIZE 8192
MODE Edit
EDIT Unrecoverable
IBASE Dec
OBASE Dec
WIDTH 80
COUNT 512
LOGFILE log.bbd
SPOOL No