大数跨境
0
0

深入浅析Oracle 数据库异常恢复

深入浅析Oracle 数据库异常恢复 云容灾备份安全治理
2017-06-29
2
导读:一、问题现场:由于机房停电,导致数据库无法正常打开,报错内容为: ORA-00600: 内部错误代码,

一、问题现场:

由于机房停电,导致数据库无法正常打开,报错内容为:   

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_IDfile_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。

 


【声明】内容源于网络
0
0
云容灾备份安全治理
分享云灾备规划、实施、运营、备份与恢复、数据安全、数据治理;窥视国内外备份软件与监控软件知识前沿水平线; 越努力,越幸运!
内容 2171
粉丝 0
云容灾备份安全治理 分享云灾备规划、实施、运营、备份与恢复、数据安全、数据治理;窥视国内外备份软件与监控软件知识前沿水平线; 越努力,越幸运!
总阅读4.5k
粉丝0
内容2.2k