构建并修复逻辑损坏块和物理损坏块

Oracle数据块的损坏可以分为物理损坏和逻辑损坏,参照

http://blog.csdn.net/yidian815/article/details/39990803

物理损坏和逻辑损坏发生的场景不同,因此处理的方式方法也就不同。在很多情况下,相同的损坏块处理方法对于物理损坏和逻辑损坏会产生不同的结果。对于物理损坏的模拟是比较容易的,而对逻辑损坏的模拟却不常见。

物理损坏:

要模拟物理损坏,我们只需直接手工编辑物理块既可(通过UTRAEDIT\BBED等),如

SQL> select object_name,dbms_rowid.rowid_block_number(rowid) from t1 where rownum < 9;

OBJECT_NAME		       DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------ ------------------------------------
ICOL$								 20
I_USER1 							 20
CON$								 20
UNDO$								 20
C_COBJ# 							 20
I_OBJ#								 20
PROXY_ROLE_DATA$						 20
I_IND1								 20

8 rows selected.
BBED> set file 5
	FILE#          	5

BBED> set block 20
	BLOCK#         	20

BBED> finr /c PROXY
BBED-00200: invalid keyword (finr)

BBED> find /c PROXY
 File: /home/app/oraten/oradata/oraten/tbs101.dbf (5)
 Block: 20               Offsets: 4223 to 4734           Dba:0x01400014
------------------------------------------------------------------------
 50524f58 595f524f 4c455f44 41544124 5f32ff02 c11c02c1 1c05494e 44455807
 786e0414 09191d07 786e0414 09191d13 32303130 2d30342d 32303a30 383a3234
 3a323805 56414c49 44014e01 4e014e2c 000c0749 5f555345 5223ff02 c10c02c1
 0c05494e 44455807 786e0414 09191d07 786e0414 09191d13 32303130 2d30342d
 32303a30 383a3234 3a323805 56414c49 44014e01 4e014e2c 000c0649 5f434f4c
 31ff02c1 2e02c12e 05494e44 45580778 6e041409 191d0778 6e041409 191d1332
 3031302d 30342d32 303a3038 3a32343a 32380556 414c4944 014e014e 014e2c00
 0c07495f 43434f4c 32ff02c1 3802c138 05494e44 45580778 6e041409 191d0778
 6e041409 191d1332 3031302d 30342d32 303a3038 3a32343a 32380556 414c4944
 014e014e 014e2c00 0c07495f 43444546 33ff02c1 3502c135 05494e44 45580778
 6e041409 191d0778 6e041409 191d1332 3031302d 30342d32 303a3038 3a32343a
 32380556 414c4944 014e014e 014e2c00 0c07495f 49434f4c 31ff02c1 2902c129
 05494e44 45580778 6e041409 191d0778 6e041409 191d1332 3031302d 30342d32
 303a3038 3a32343a 32380556 414c4944 014e014e 014e2c00 0c07495f 43444546
 31ff02c1 3302c133 05494e44 45580778 6e041409 191d0778 6e041409 191d1332
 3031302d 30342d32 303a3038 3a32343a 32380556 414c4944 014e014e 014e2c00 

 <32 bytes per line>

BBED> dump /v
 File: /home/app/oraten/oradata/oraten/tbs101.dbf (5)
 Block: 20      Offsets: 4223 to 4734  Dba:0x01400014
-------------------------------------------------------
 50524f58 595f524f 4c455f44 41544124 l PROXY_ROLE_DATA$
 5f32ff02 c11c02c1 1c05494e 44455807 l _2........INDEX.
 786e0414 09191d07 786e0414 09191d13 l xn......xn......
 32303130 2d30342d 32303a30 383a3234 l 2010-04-20:08:24
 3a323805 56414c49 44014e01 4e014e2c l :28.VALID.N.N.N,
 000c0749 5f555345 5223ff02 c10c02c1 l ...I_USER#......
 0c05494e 44455807 786e0414 09191d07 l ..INDEX.xn......
 786e0414 09191d13 32303130 2d30342d l xn......2010-04-
 32303a30 383a3234 3a323805 56414c49 l 20:08:24:28.VALI
 44014e01 4e014e2c 000c0649 5f434f4c l D.N.N.N,...I_COL
 31ff02c1 2e02c12e 05494e44 45580778 l 1........INDEX.x
 6e041409 191d0778 6e041409 191d1332 l n......xn......2
 3031302d 30342d32 303a3038 3a32343a l 010-04-20:08:24:
 32380556 414c4944 014e014e 014e2c00 l 28.VALID.N.N.N,.
 0c07495f 43434f4c 32ff02c1 3802c138 l ..I_CCOL2...8..8
 05494e44 45580778 6e041409 191d0778 l .INDEX.xn......x
 6e041409 191d1332 3031302d 30342d32 l n......2010-04-2
 303a3038 3a32343a 32380556 414c4944 l 0:08:24:28.VALID
 014e014e 014e2c00 0c07495f 43444546 l .N.N.N,...I_CDEF
 33ff02c1 3502c135 05494e44 45580778 l 3...5..5.INDEX.x
 6e041409 191d0778 6e041409 191d1332 l n......xn......2
 3031302d 30342d32 303a3038 3a32343a l 010-04-20:08:24:
 32380556 414c4944 014e014e 014e2c00 l 28.VALID.N.N.N,.
 0c07495f 49434f4c 31ff02c1 2902c129 l ..I_ICOL1...)..)
 05494e44 45580778 6e041409 191d0778 l .INDEX.xn......x
 6e041409 191d1332 3031302d 30342d32 l n......2010-04-2
 303a3038 3a32343a 32380556 414c4944 l 0:08:24:28.VALID
 014e014e 014e2c00 0c07495f 43444546 l .N.N.N,...I_CDEF
 31ff02c1 3302c133 05494e44 45580778 l 1...3..3.INDEX.x
 6e041409 191d0778 6e041409 191d1332 l n......xn......2
 3031302d 30342d32 303a3038 3a32343a l 010-04-20:08:24:
 32380556 414c4944 014e014e 014e2c00 l 28.VALID.N.N.N,.

 <16 bytes per line>

BBED> modify /c abcde
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
 File: /home/app/oraten/oradata/oraten/tbs101.dbf (5)
 Block: 20               Offsets: 4223 to 4734           Dba:0x01400014
------------------------------------------------------------------------
 61626364 655f524f 4c455f44 41544124 5f32ff02 c11c02c1 1c05494e 44455807
 786e0414 09191d07 786e0414 09191d13 32303130 2d30342d 32303a30 383a3234
 3a323805 56414c49 44014e01 4e014e2c 000c0749 5f555345 5223ff02 c10c02c1
 0c05494e 44455807 786e0414 09191d07 786e0414 09191d13 32303130 2d30342d
 32303a30 383a3234 3a323805 56414c49 44014e01 4e014e2c 000c0649 5f434f4c
 31ff02c1 2e02c12e 05494e44 45580778 6e041409 191d0778 6e041409 191d1332
 3031302d 30342d32 303a3038 3a32343a 32380556 414c4944 014e014e 014e2c00
 0c07495f 43434f4c 32ff02c1 3802c138 05494e44 45580778 6e041409 191d0778
 6e041409 191d1332 3031302d 30342d32 303a3038 3a32343a 32380556 414c4944
 014e014e 014e2c00 0c07495f 43444546 33ff02c1 3502c135 05494e44 45580778
 6e041409 191d0778 6e041409 191d1332 3031302d 30342d32 303a3038 3a32343a
 32380556 414c4944 014e014e 014e2c00 0c07495f 49434f4c 31ff02c1 2902c129
 05494e44 45580778 6e041409 191d0778 6e041409 191d1332 3031302d 30342d32
 303a3038 3a32343a 32380556 414c4944 014e014e 014e2c00 0c07495f 43444546
 31ff02c1 3302c133 05494e44 45580778 6e041409 191d0778 6e041409 191d1332
 3031302d 30342d32 303a3038 3a32343a 32380556 414c4944 014e014e 014e2c00 

 <32 bytes per line>
SQL> alter system flush buffer_cache;

System altered.

SQL> select object_name,dbms_rowid.rowid_block_number(rowid) from t1 where rownum < 9;
select object_name,dbms_rowid.rowid_block_number(rowid) from t1 where rownum < 9
                                                             *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 5, block # 20)
ORA-01110: data file 5: '/home/app/oraten/oradata/oraten/tbs101.dbf'

而对物理损坏的修复也非常简单( 上面修改的并不是第7条记录):

BBED> sum apply
Check value for File 5, Block 20:
current = 0xb5e0, required = 0xb5e0
SQL> alter system flush buffer_cache;

System altered.

SQL> select object_name,dbms_rowid.rowid_block_number(rowid) from t1 where object_name like '%abcde%';

OBJECT_NAME		       DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------ ------------------------------------
I_abcde_ROLE_DATA$_2						 20

对于逻辑损坏的模拟,确实比较麻烦,因为只有oracle才知道数据块的内部逻辑结构。今天我们尝试模拟一种逻辑错误。我们指定oracle的数据是以row为单位存储在数据块中的,而每个row的第一个byte具有特殊含义,该字节的每一个位都表示不同的含义,如下图

如果我们通过bbed手工修改该byte的存储内容,那么oracle就有可能不能很好的识别该条记录,从而引发逻辑错误。

BBED> set file 5
	FILE#          	5

BBED> set block 20
	BLOCK#         	20

BBED> map /v
 File: /home/app/oraten/oradata/oraten/tbs101.dbf (5)
 Block: 20                                    Dba:0x01400014
------------------------------------------------------------
 KTB Data Block (Table/Cluster)

 struct kcbh, 20 bytes                      @0
    ub1 type_kcbh                           @0
    ub1 frmt_kcbh                           @1
    ub1 spare1_kcbh                         @2
    ub1 spare2_kcbh                         @3
    ub4 rdba_kcbh                           @4
    ub4 bas_kcbh                            @8
    ub2 wrp_kcbh                            @12
    ub1 seq_kcbh                            @14
    ub1 flg_kcbh                            @15
    ub2 chkval_kcbh                         @16
    ub2 spare3_kcbh                         @18      

 struct ktbbh, 96 bytes                     @20
    ub1 ktbbhtyp                            @20
    union ktbbhsid, 4 bytes                 @24
    struct ktbbhcsc, 8 bytes                @28
    b2 ktbbhict                             @36
    ub1 ktbbhflg                            @38
    ub1 ktbbhfsl                            @39
    ub4 ktbbhfnx                            @40
    struct ktbbhitl[3], 72 bytes            @44      

 struct kdbh, 14 bytes                      @124
    ub1 kdbhflag                            @124
    b1 kdbhntab                             @125
    b2 kdbhnrow                             @126
    sb2 kdbhfrre                            @128
    sb2 kdbhfsbo                            @130
    sb2 kdbhfseo                            @132
    b2 kdbhavsp                             @134
    b2 kdbhtosp                             @136     

 struct kdbt[1], 4 bytes                    @138
    b2 kdbtoffs                             @138
    b2 kdbtnrow                             @140     

 sb2 kdbr[96]                               @142     

 ub1 freespace[868]                         @334     

 ub1 rowdata[6986]                          @1202    

 ub4 tailchk                                @8188    

BBED> p *kdbr[1]
rowdata[6844]
-------------
ub1 rowdata[6844]                           @8046     0x2c

BBED> set offset 8046
	OFFSET         	8046

BBED> x /rccnncttccccc
rowdata[6844]                               @8046
-------------
[email protected]: 0x2c (KDRHFL, KDRHFF, KDRHFH)
[email protected]: 0x00
[email protected]:   12

col    0[7] @8049: I_USER1
col    1[0] @8057: *NULL*
col    2[2] @8058: 44
col    3[2] @8061: 44
col    4[5] @8064: INDEX
col    5[7] @8070: 2010-04-20 08:24:28
col    6[7] @8078: 2010-04-20 08:24:28
col   7[19] @8086: 2010-04-20:08:24:28
col    8[5] @8106: VALID
col    9[1] @8112: N
col   10[1] @8114: N
col   11[1] @8116: N

BBED> set offset 8046
	OFFSET         	8046

BBED> modify /x ff
 File: /home/app/oraten/oradata/oraten/tbs101.dbf (5)
 Block: 20               Offsets: 8046 to 8191           Dba:0x01400014
------------------------------------------------------------------------
 ff000c07 495f5553 455231ff 02c12d02 c12d0549 4e444558 07786e04 1409191d
 07786e04 1409191d 13323031 302d3034 2d32303a 30383a32 343a3238 0556414c
 4944014e 014e014e 2c000c05 49434f4c 24ff02c1 1502c103 05544142 4c450778
 6e041409 191d0778 6e041409 211a1332 3031302d 30342d32 303a3038 3a32343a
 32380556 414c4944 014e014e 014e0106 5af8 

 <32 bytes per line>

BBED> x /rccnncttccccc
rowdata[6844]                               @8046
-------------
[email protected]: 0xff (KDRHFN, KDRHFP, KDRHFL, KDRHFF, KDRHFD, KDRHFH, KDRHFC, KDRHFK)
[email protected]: 0x00
[email protected]:    0
[email protected]:    7

BBED> sum apply
Check value for File 5, Block 20:
current = 0xb533, required = 0xb533

此时我们通过sqlpus查询并编辑t1

SQL> alter system flush buffer_cache;

System altered.

SQL> select count(*) from t1;

  COUNT(*)
----------
     22944

SQL> select sum(length(object_name)) from t1;

SUM(LENGTH(OBJECT_NAME))
------------------------
		  531915

SQL> update t1 set object_name = rownum;
update t1 set object_name = rownum
       *
ERROR at line 1:
ORA-00607: Internal error occurred while making a change to a data block
ORA-00600: internal error code, arguments: [kddummy_blkchk], [5], [20], [6251],
[], [], [], []

SQL> rollback;

Rollback complete.

SQL> update t1 set object_name = rownum;
update t1 set object_name = rownum
       *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 5, block # 20)
ORA-01110: data file 5: '/home/app/oraten/oradata/oraten/tbs101.dbf'

可见此时oracle认为发生了逻辑错误,查看block20的标志位发现, 逻辑损坏的标记(14字节修改位ff,tailchk中包含ff)已经打上。

BBED> set file 5
	FILE#          	5

BBED> set block 20
	BLOCK#         	20

BBED> set offset 14
	OFFSET         	14

BBED> dump /v count 12
 File: /home/app/oraten/oradata/oraten/tbs101.dbf (5)
 Block: 20      Offsets:   14 to   25  Dba:0x01400014
-------------------------------------------------------
 ff0438b5 00000100 00001ecb          l ..8.........

 <16 bytes per line>

BBED> set offset 8188
	OFFSET         	8188

BBED> dump /v
 File: /home/app/oraten/oradata/oraten/tbs101.dbf (5)
 Block: 20      Offsets: 8188 to 8191  Dba:0x01400014
-------------------------------------------------------
 ff060000                            l ....

 <16 bytes per line>

而逻辑损坏的修复,通常是使用dbms_repair 包将损坏块忽略

SQL> exec dbms_repair.skip_corrupt_blocks('SYS','T1');

PL/SQL procedure successfully completed.

SQL> update t1 set object_name=rownum;

22849 rows updated.

SQL> commit;

Commit complete.
时间: 2024-08-24 20:43:07

构建并修复逻辑损坏块和物理损坏块的相关文章

PostgreSQL物理坏块和文件损坏案例分享

作者简介 王睿操,平安好医数据库架构岗,多年postgresql数据库运维开发工作.曾就职于中国民航信息,迪卡侬.对其他数据库产品也有一定的涉猎. 背景 笔者最近发现很多朋友经常遇到PostgreSQL坏块或者数据混乱的情况,网上中文资料比较少,于是整理了一下笔者遇到各种各样的报错以及解决方案 案例一:物理坏块 逻辑备份时报错 pg_dump: Dumping the contents of table "xxxx" failed: PQgetResult() failed. pg_d

Oracle Rman修复逻辑坏块

RMAN 实现数据块恢复试用Rman可以实现数据块级的数据恢复,在传统恢复手段中即某个数据文件的一个数据块被损坏,就造成整个数据文件无法试用,此时必须通过备份恢复整个数据文件.显然这样的方法会会时间较长,而RMAN实现块级恢复,如果某个数据文件的数据损坏,通过数据文件的完整备份就可以恢复数据块. 案例:数据库是一个单实例ORACLE数据库,该库的总大小有700G.存储设备使用华为存储,备份设备使用希捷3T的移动硬盘.该数据库无DG无OGG.备份策略为每周六0点全库备份,周三0点1级差异备份其余时

12 oracle 数据库坏块--物理坏块-ORA-01578/ORA-01110

oracle 数据库坏块--物理坏块 数据坏块的类型物理坏块:通常是由于硬件损坏如磁盘异常导致.内存有问题.存储链有问题. IO有问题.文件系统有问题. Oracle本身的问题等逻辑坏块:可能都是软件问题导致通常是由于oracle bug导致,比如data block和index block数据不一致第三方软件或者硬件造成的物理损坏物理数据坏块的场景常见的物理坏块(Physical Block Corruptions)有块头和块尾信息不一致(Fractured/Incomplete),check

将逻辑卷降为物理分区

最近测试vertica列式数据仓库的需要,需将原来几台运行MySQL服务的linux服务器中的逻辑卷降为物理分区并重新创建文件系统. 服务器置维护 备份原来的数据 停掉mysql服务 卸载逻辑卷 sudo umount /dev/mapper/VolGroup01-LogVol00 sudo vim /etc/rc.local 注释掉 mount -o noatime,nodiratime,nobarrier,logbufs=8 /dev/VolGroup01/LogVol00 /data 移除

SQL Server逻辑读-预读-物理读

SQL Server逻辑读-预读-物理读    SQL Server 存储数据的方式        1.页是最小的操作单元,也就是说从磁盘读取数据库的时候最少读取一页,每一页的大小是8KB,SQL SERVER对于页的读取是原子性,要么读完一页,要么完全不读,不会有中间状态 2.区是8个连续的页组成的,区是最小的分配单元,当需要空间时最少分配一个区的空间. 看图说话,两个表的结构完全一样,一个插入四条数据,另一个插入100条数据,结果大小都为0.008: SQL SERVER一页的总大小为:8K

java中的静态代码块、构造代码块、普通代码块和同步代码块总结

java中的4中代码块总结如下: * 加了static的是静态代码块,在类中写了一对{}是构造代码块,在方法中写了一对{}是普通代码块, * java中还有一种代码块是同步代码块,常用在多线程中, synchronized关键字, * 同步代码块格式是:synchronized(同步对象){} * 静态代码块 先于构造代码块 先于构造方法执行 * 静态代码块 先于普通代码块 先于构造方法执行 * 构造代码块和普通代码块按照程序逻辑顺序执行 package 面试题; class HelloA{ p

Java中普通代码块,构造代码块,静态代码块区别及代码示例

//普通代码块:在方法或语句中出现的{}就称为普通代码块.普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--"先出现先执行"public class CodeBlock01{ public static void main(String[] args){ { int x=3; System.out.println("1,普通代码块内的变量x="+x); } int x=1; System.out.println("主方法内的变量x="

Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究

随笔- 40  文章- 0  评论- 1 Java的初始化块.静态初始化块.构造函数的执行顺序及用途探究 Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, C三个类用作测试,其中B继承了A,C又继承了B,并分别给它们加上静态初始化块.非静态初始化块和构造函数,里面都是一句简单的输出. 主类Main里面也如法炮制. 1 class A { 2 st

局部代码块和构造代码块

局部代码块 1 package com_package2; 2 3 public class Person3Demo { 4 public static void main(String[]args) 5 { 6 Person3 p = new Person3(); 7 p.speak(); 8 Person3 p1 = new Person3("hejinjin",23); 9 p1.speak(); 10 Person3 p2 = new Person3("hejinji