一、问题现场:
由于机房停电,导致数据库无法正常打开,报错内容为:
ORA-00600: 内部错误代码, 参数: [kcratr_nab_less_than_odr], [1], [73140], [12856],[12900], [], [], [], [], [], [], []
ORA-00600: 内部错误代码, 参数: [kcratr_nab_less_than_odr], [1], [73140], [12856],[12900], [], [], [], [], [], [], []
ORA-00600: 内部错误代码, 参数: [kcratr_nab_less_than_odr], [1], [73140], [12856],[12900], [], [], [], [], [], [], []
WARNING! Crash recovery of thread 1 seq 73140 isending at redo block 12856 but should not have ended beforeredo block 12900
通过alert和trace中的内容可以知道,数据库需要恢复到rba到12900,但是因为某种原因,目前只能利用在线的 1号REDO 的73140 seq#序列号,恢复rba到12856,数据库无法正常open。
二、处理步骤:
2.1重建控制文件
[oracle@test ~]$sqlplus/ as sysdba
Connected to:
Oracle Database11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With thePartitioning, OLAP, Data Mining and Real Application Testing options
sql> startup mount ;
sql>alter database backup controlfile to trace as '/tmp/control.ctl';
2.2修改控制文件内容
注意:在线日志都是存在的,只是current日志中记录的最大SCN与控制文件不符,调整参数文件:(如果不确定怎么修改,可以看控制文件备份的文本说明)
STARTUPNOMOUNT
CREATECONTROLFILE REUSE DATABASE "*******" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 2336
LOGFILE
GROUP 1 '/u01/app/oracle/oradata/*****/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/u01/app/oracle/oradata/*****/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/u01/app/oracle/oradata/*****/redo03.log' SIZE 50M BLOCKSIZE 512
-- STANDBYLOGFILE
DATAFILE
'/u01/app/oracle/oradata/****/system01.dbf',
'/u01/app/oracle/oradata/***/sysaux01.dbf',
'/u01/app/oracle/oradata/***/undotbs01.dbf',
'/u01/app/oracle/oradata/****/users01.dbf',
'/u02/oradata/********.dbf',
'/u02/oradata**********.dbf',
'/u02/oradata/**************.dbf',
'/u01/app/oracle/oradata/******/************.dbf',
'/u02/oradata/************.DBF',
'/u01/app/oracle/oradata/********** /***********.dbf',
'/u02/oradata/************************.dbf'
CHARACTERSET ZHS16GBK
;
--------------------------以上涉及到公司机密部分,此次用****表示-------------------------------------------
2.3 尝试介质恢复
[oracle@TEST~]$sqlplus / as sysdba
Connected to:
OracleDatabase 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
Withthe Partitioning, OLAP, Data Mining and Real Application Testing options
sql>Shutdown abort;
sql> start ‘/tmp/control.or’
sql>recover database;
完成介质恢复。
sql>alterdatabase open;
ORA-00604:递归 SQL 级别 1 出现错误
ORA-01578:ORACLE 数据块损坏 (文件号 1, 块号53306)
ORA-01110:数据文件 1: '/u01/app/oracle/oradata/hfsgy/system01.dbf'
2.4 坏块分析
SQL> select segment_name,extent_id ,block_id,blocks fromdba_extents where owner='SYS' and block_id between 53306-128 and 53306+128;
----范围自己可以多次尝试8,128,1024等
SEGMENT_NAME EXTENT_ID BLOCK_ID BLOCKS
-------------------------------------------------- -------------------- ----------
OBJ$ 20 53248 128
JAVASNM$ 17 53376 128
JAVA$MC$ 2 53216 8
I_OBJAUTH1 11 53240 8
I_ACCESS1 11 53200 8
I_ACCESS1 12 53208 8
I_ACCESS1 13 53224 8
I_ACCESS1 14 53232 8
I_IDL_UB11 12 53184 8
I_JAVAOBJ1 5 53192 8
可见:53306坏对应的表段为:OBJ$ ,但是不能确定SYSTEM表空间是否存在物理损坏。
2.5 使用DBV检查文件坏块
[oracle@trace]$ dbv file='/u01/app/oracle/oradata/hfsgy/system01.dbf';
DBVERIFY: Release 11.2.0.1.0 - Production on ?..浜.6?.23 09:18:52 2017
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
DBVERIFY - Verification starting : FILE = /u01/app/oracle/oradata/hfsgy/system01.dbf
DBV-00200: Block, DBA 4247610, already marked corrupt
DBVERIFY - Verification complete
Total Pages Examined : 128000
Total Pages Processed (Data) : 92698
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 16675
Total Pages Failing (Index): 0
Total Pages Processed (Other): 3131
Total Pages Processed (Seg) : 1
Total Pages Failing (Seg) : 0
Total Pages Empty : 15496
Total Pages Marked Corrupt : 1
Total Pages Influx : 0
Total Pages Encrypted : 0
Highest block SCN : 892386349 (2839.892386349)
2.6 使用BBED检查坏块并进行修改
编译BBED略;
[oracle@TEST~]$ catfile.txt
1 /u01/app/oracle/oradata/hfsgy/system01.dbf 1048576000
(通过SELELCT FILE_ID,file_name ,bytes fromdba_data_files 获取SYSTEM表空间文件位置和大小)
[oracle@i-0F41AE5F ~]$ cat pfile.txt
listfile=/home/oracle/file.txt
mode=edit ---------EDIT为修改模式
blocksize=8192 -------数据块大小
[oracle@i-0F41AE5F ~]$ bbed parfile=pfile.txt
Password: ----------密码为:blockedit
BBED: Release 2.0.0.0.0 - Limited Production on ?..浜.6?.23 09:19:46 2017
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
************* !!! For Oracle Internal Use only !!!***************
BBED> set block 53306 - -----设置块号,可以使用set dba 1,53306
BLOCK# 53306
BBED> map
File:/u01/app/oracle/oradata/hfsgy/system01.dbf (1)
Block: 53306 Dba:0x0040d03a
------------------------------------------------------------
KTB Data Block(Table/Cluster)
struct kcbh, 20bytes @0 --- 块头
struct ktbbh, 48bytes @20 ---事物槽
struct kdbh, 14bytes @68 ---数据层
struct kdbt[1], 4 bytes @82 ---表目录
sb2 kdbr[81] @86 ----行目录
ub1 freespace[885] @248 --剩余空间
ub1 rowdata[7055] @1133 --行数据
ub4 tailchk @8188 ---块尾部校验位
检验块头是否正常:
BBED> p kcbh
struct kcbh, 20 bytes @0
ub1 type_kcbh @0 0x06—块类型,块尾检验位部分
ub1 frmt_kcbh @1 0xa2---块头格式
ub1 spare1_kcbh @2 0x00
ub1 spare2_kcbh @3 0x00
ub4 rdba_kcbh @4 0x0040d03a----块地址
ub4 bas_kcbh @8 0x352ea8f8—--低位SCN,低2位是块尾校验位部分
ub2 wrp_kcbh @12 0x0b17-----高位SCN
ub1seq_kcbh @14 0xff-----块序列号 ff 表示逻辑坏块,块尾检验部分
ub1 flg_kcbh @15 0x04 (KCBHFCKV)
ub2 chkval_kcbh @16 0x3385
ub2 spare3_kcbh @18 0x0000
分析得知:坏块是逻辑坏块:块头偏移量14处,块序列号ID异常。注意以下3个位置不一致,在DBV分析文件时,也会报坏块或SCN不一致错误坏。
BBED> p offset 8
kcbh.bas_kcbh
ub4 bas_kcbh @8 0x352ea8f8
BBED> p offset 28
ktbbh.ktbbhcsc.kscnbas
ub4 kscnbas @28 0x352ea8f8
BBED> p offset 64
ktbbh.ktbbhitl[0].ktbitbas
ub4 ktbitbas @64 0x352ea8f8
BBED> p tailchk
ub4 tailchk @8188 0xa8f806ff
数据块尾检验值构成逻辑为:kscnbas(低2位) + type_kcbh + seq_kcbh,所以正确的块检验应为:
0Xa8f80610 -----------------------------10是我们对错误ff进行随意修改的值。
对块头偏移量@14和块尾进行修改:
modify /x 10 dba 1,53306offset 4; -----------修改块头:ub1 seq_kcbh @14
mofiy /x 10 dba 1,53306offset 8188;----------修改块尾:ub4 tailchk @8188
sum appy;---------应用更改
verify;-----再次验证块
修改完毕,再次使用DBV来检查1号文件
[oracle@i-0F41AE5F ~]$dbv file='/u01/app/oracle/oradata/hfsgy/system01.dbf';
DBVERIFY: Release11.2.0.1.0 - Production on 星期五 6月 23 09:50:57 2017
Copyright (c) 1982, 2009,Oracle and/or its affiliates. All rightsreserved.
DBVERIFY - Verificationstarting : FILE = /u01/app/oracle/oradata/hfsgy/system01.dbf
DBVERIFY - Verificationcomplete
Total Pages Examined : 128000
Total Pages Processed(Data) : 92698
Total Pages Failing (Data) : 0
Total Pages Processed(Index): 16675
Total Pages Failing (Index): 0
Total Pages Processed(Other): 3131
Total Pages Processed(Seg) : 1
Total Pages Failing (Seg) : 0
Total Pages Empty : 15496
Total Pages MarkedCorrupt : 0
Total Pages Influx : 0
Total PagesEncrypted : 0
Highest block SCN : 892413481 (2839.892413481)
2.7 最终打开数据库
尝试打开数据库:
SQL> shutdown abort;
ORACLE instance shutdown.
SQL> startup
ORACLE instance started.
Total System Global Area6680915968 bytes
Fixed Size 2213936 bytes
Variable Size 5100275664 bytes
Database Buffers 1543503872 bytes
Redo Buffers 34922496 bytes
Database mounted.
Database opened.
SQL> exit
此致,恢复完成,成功打开了数据。
三、恢复总结:
DBV在检查数据库逻辑坏块大致顺序:首会检查该块偏移量8, 28,64等位置,首先确定块头SCN与事物槽SCN是否一致,检查无误,再检查偏移量14。

