签到成功

知道了

CNDBA社区CNDBA社区

坏块类型-FRACTURED模拟与修复

2018-03-15 17:12 3025 0 原创 数据坏块
作者: Marvinn

corruption_type: 坏块类型

■ ALL ZERO  - 磁盘上的块头只包含0字节,在ORACLE 7,若它没有被修复,该块可能是有效的,在Oracle 8将会被格式话成标准空块.
■ FRACTURED - 数据块头看起来合理,但块头跟块后tailchk属于不同版本(值不同).
■ CHECKSUM  - 数据块的检查值不一致,不确定为什么检查值失败,但可能是数据块中间的扇区版本值不同
■ CORRUPT - 数据块被错误标识或者不是一个数据块(比如数据块地址丢失)
■ LOGICAL - 逻辑坏块
■ NOLOGGING - 数据块中没有重做日志存在(比如,主库上NOLOGGING操作可能在物理备库上产生这种类型的坏块)

前期创建测试环境步骤省略,详情请看文章 >>> 坏块类型-ALL ZERO模拟与修复http://www.cndba.cn/Marvinn/article/2685

前期环境检查http://www.cndba.cn/Marvinn/article/2685

13:48:57 SYS@orcl>alter database open;

Database altered.

Elapsed: 00:00:03.99
13:49:07 SYS@orcl>conn jwt/123456@pdb;
Connected.
13:49:15 > select * from v$database_block_corruption;

13:49:15 > select * from v$database_block_corruption;

no rows selected

Elapsed: 00:00:00.02

13:55:17 SYS@orcl>select count(*) from jwt.marvin;

  COUNT(*)
----------
     20000

Elapsed: 00:00:00.03

--说明当前环境并不存在坏块现象

13:55:40 SYS@orcl>select distinct dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from jwt.marvin;

DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------ ------------------------------------
                                  29                                  228
                                  29                                  211
                                  29                                  220
                                  29                                  230
                                  29                                  213
                                  29                                  218
                                  29                                  215
                                  29                                  216
                                  29                                  217
                                  29                                  221
                                  29                                  214

DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------ ------------------------------------
                                  29                                  223
                                  29                                  231
                                  29                                  222
                                  29                                  212
                                  29                                  219
                                  29                                  229

SYS@orcl>select name from v$datafile where file#=29;

NAME
--------------------------------------------------------------------------------
/data/datafile/ORCL/5A5847E139AF054EE05375B029ACCC94/datafile/jwt.dbf

Elapsed: 00:00:00.03

模拟 FRACTURED

BBED模拟 前后版本不一致(tailchk)

设置只读表空间
14:00:27 SYS@orcl>14:00:27 SYS@orcl>alter tablespace jwt read only;

Tablespace altered.

Elapsed: 00:00:00.89

BBED> set filename '/data/datafile/ORCL/5A5847E139AF054EE05375B029ACCC94/datafile/jwt.dbf'
        FILENAME        /data/datafile/ORCL/5A5847E139AF054EE05375B029ACCC94/datafile/jwt.dbf

BBED> set block 228                  -- 任选表数据所在块
        BLOCK#          228

BBED> show
        FILE#           0
        BLOCK#          228
        OFFSET          0
        DBA             0x00000000 (0 0,228)
        FILENAME        /data/datafile/ORCL/5A5847E139AF054EE05375B029ACCC94/datafile/jwt.dbf
        BIFILE          bifile.bbd
        LISTFILE       
        BLOCKSIZE       8192
        MODE            Browse
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           512
        LOGFILE         log.bbd
        SPOOL           No

查看tailchk值
BBED> p  tailchk
ub4 tailchk                                 @8188     0x6e1d0601

tailchk = SCN BASE低两位 + type +seq (bas_kcbh低两位字节 + type_kcbh + seq_kcbh)
BBED> p bas_kcbh
ub4 bas_kcbh                                @8        0x20786e1d

BBED> p type_kcbh
ub1 type_kcbh                               @0        0x06

BBED> p seq_kcbh
ub1 seq_kcbh                                @14       0x01

BBED> set offset 8188
        OFFSET          8188

BBED> dump /v count 10
 File: /data/datafile/ORCL/5A5847E139AF054EE05375B029ACCC94/datafile/jwt.dbf (0)
 Block: 228     Offsets: 8188 to 8191  Dba:0x00000000
-------------------------------------------------------
 01061d6e                            l ...n

 <16 bytes per line>

BBED> sum
Check value for File 0, Block 228:
current = 0xe9fb, required = 0xe9fb

BBED> set mode edit
        MODE            Edit

BBED> modify /x 01061de6 offset 8188
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) Y
 File: /data/datafile/ORCL/5A5847E139AF054EE05375B029ACCC94/datafile/jwt.dbf (0)
 Block: 228              Offsets: 8188 to 8191           Dba:0x00000000
------------------------------------------------------------------------
 01061de6 

 <32 bytes per line>

BBED> sum apply
Check value for File 0, Block 228:
current = 0x61fb, required = 0x61fb

BBED> print tailchk
ub4 tailchk                                 @8188     0xe61d0601


--刷新数据库缓存
15:55:03 JWT@pdb>alter system flush buffer_cache;

System altered.

Elapsed: 00:00:00.19
16:02:07 JWT@pdb>select count(*) from jwt.marvin;
select count(*) from jwt.marvin
       *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 29, block # 228)
ORA-01110: data file 29:
'/data/datafile/ORCL/5A5847E139AF054EE05375B029ACCC94/datafile/jwt.dbf'


Elapsed: 00:00:09.20

--发现坏块
16:02:52 JWT@pdb>select * from v$database_block_corruption;

     FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO     CON_ID
---------- ---------- ---------- ------------------ --------- ----------
        29        228          1                  0 FRACTURED          6

Elapsed: 00:00:00.09

恢复方法:

http://www.cndba.cn/Marvinn/article/2685
http://www.cndba.cn/Marvinn/article/2685http://www.cndba.cn/Marvinn/article/2685

1、BBEDhttp://www.cndba.cn/Marvinn/article/2685http://www.cndba.cn/Marvinn/article/2685http://www.cndba.cn/Marvinn/article/2685http://www.cndba.cn/Marvinn/article/2685

由于该类型的坏块,是使用BBED工具模拟破坏tailchk的..所以可以直接在模拟页面直接使用revert命令恢复所有操作,在刷新数据库缓存即可(这种实际环境是不可能用到的)


恢复手段:该类型的坏块是由于tail与块头值不一致,导致数据块版本不一致
oracle@12cDG:/u01/oracle/12.2.0/dbs>bbed
Password: 

BBED: Release 2.0.0.0.0 - Limited Production on Thu Mar 15 16:32:13 2018

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

************* !!! For Oracle Internal Use only !!! ***************

BBED> set filename '/data/datafile/ORCL/5A5847E139AF054EE05375B029ACCC94/datafile/jwt.dbf'
        FILENAME        /data/datafile/ORCL/5A5847E139AF054EE05375B029ACCC94/datafile/jwt.dbf

BBED> set block 228
        BLOCK#          228

BBED> p  tailchk
ub4 tailchk                                 @8188     0xe61d0601

BBED> p kcbh
struct kcbh, 20 bytes                       @0       
   ub1 type_kcbh                            @0        0x06
   ub1 frmt_kcbh                            @1        0xa2
   ub2 wrp2_kcbh                            @2        0x0000
   ub4 rdba_kcbh                            @4        0x074000e4
   ub4 bas_kcbh                             @8        0x20786e1d
   ub2 wrp_kcbh                             @12       0x0000
   ub1 seq_kcbh                             @14       0x01
   ub1 flg_kcbh                             @15       0x06 (KCBHFDLC, KCBHFCKV)
   ub2 chkval_kcbh                          @16       0x61fb
   ub2 spare3_kcbh                          @18       0x0000

BBED> dump /v offset 8188 count 10
 File: /data/datafile/ORCL/5A5847E139AF054EE05375B029ACCC94/datafile/jwt.dbf (0)
 Block: 228     Offsets: 8188 to 8191  Dba:0x00000000
-------------------------------------------------------
 01061de6                            l ....

 <16 bytes per line>

 从上可知,数据块tailchk值为6e1d0601
 由于机器低字节序的原因,所有修复使用值为01061d6e

···
也可以从DBV命令中last change scn 参数里的最后四位获取到tailchk值中的前四个字节 即SCN BASE
(last change scn 参数里的最后四位 = SCN BASE值 --需要修改的数据库版本值)
 oracle@12cDG:/home/oracle>dbv file= /data/datafile/ORCL/5A5847E139AF054EE05375B029ACCC94/datafile/jwt.dbf

DBVERIFY: Release 12.2.0.1.0 - Production on Thu Mar 15 16:32:54 2018

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

DBVERIFY - Verification starting : FILE = /data/datafile/ORCL/5A5847E139AF054EE05375B029ACCC94/datafile/jwt.dbf
Page 228 is influx - most likely media corrupt
Corrupt block relative dba: 0x074000e4 (file 29, block 228)
Fractured block found during dbv: 
Data in bad block:
 type: 6 format: 2 rdba: 0x074000e4
 last change scn: 0x0000.0000.20786e1d seq: 0x1 flg: 0x06
 spare3: 0x0
 consistency value in tail: 0xe61d0601
 check value in block header: 0x61fb
 computed block checksum: 0x0



DBVERIFY - Verification complete

Total Pages Examined         : 1280
Total Pages Processed (Data) : 79
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 1194
Total Pages Processed (Seg)  : 0
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 6
Total Pages Marked Corrupt   : 1
Total Pages Influx           : 1
Total Pages Encrypted        : 0
Highest block SCN            : 544763421 (0.544763421)
···
BBED> modify /x 01061d6e offset 8188
BBED-00215: editing not allowed in BROWSE mode


BBED> set mode edit
        MODE            Edit

BBED> modify /x 01061d6e offset 8188
 File: /data/datafile/ORCL/5A5847E139AF054EE05375B029ACCC94/datafile/jwt.dbf (0)
 Block: 228              Offsets: 8188 to 8191           Dba:0x00000000
------------------------------------------------------------------------
 01061d6e 

 <32 bytes per line>

BBED> sum apply
Check value for File 0, Block 228:
current = 0xe9fb, required = 0xe9fb

BBED> 

验证....
16:14:59 JWT@pdb>alter system flush buffer_cache;

System altered.

Elapsed: 00:00:00.20
16:43:56 JWT@pdb>select count(*) from jwt.marvin;

  COUNT(*)
----------
     10000

Elapsed: 00:00:00.01


数据块恢复成功....

2、DBMS_REPAIR包恢复 (丢失数据)http://www.cndba.cn/Marvinn/article/2685

此方法步骤省略,详情见坏块类型-ALL ZERO模拟与修复

3、CTAS方式复制(丢失数据)

此方法步骤省略,详情请见坏块类型-ALL ZERO模拟与修复

4、备份恢复(不丢)

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
Marvinn

Marvinn

关注

路漫漫其修远兮、吾将上下而求索

  • 99
    原创
  • 0
    翻译
  • 2
    转载
  • 36
    评论
  • 访问:458469次
  • 积分:449
  • 等级:中级会员
  • 排名:第12名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ