0

问题剖析:Oracle数据库坏块--物理坏块

彭小波 2016-08-17
294


彭小波 

ACOUG核心成员,Oracle用户组年轻专家。擅长Oracle数据库架构规划、SQL,OWI方面的优化。曾服务于各大企业数据库的维护以及系统开发,目前从事百年人寿保险股份有限公司的数据库服务与运维工作。


编辑手记:感谢作者的文章和授权,今天我们来学习数据库中对物理坏块的分析及相关的处理!


数据库坏块(corruption) 的类型可以按照坏块所属对象的不同,分为用户数据坏块,数据字典坏块,undo 坏块,控制文件坏块,redo 坏块,lob坏块,index 坏块等;也可以按照坏块产生的原因,分为物理坏块( physical corruption )和逻辑坏块( logical corruption )。


本文主要讨论用户数据发生物理坏块( physical corruption )分析和解决方法。


常见的物理坏块(Physical Block Corruptions)有块头和块尾信息不一致( Fractured/Incomplete),checksum 值无效,数据块信息全部为0等情况,并且可能伴随错误 ORA-1578 和 ORA-1110。


为了及时发现物理坏块和准确定位坏块产生的原因,Oracle 建议设置初始化参数 DB_BLOCK_CHECKSUM=TYPICAL(默认值)。一般情况下,物理坏块是由于底层 OS/disk 系统错误/损坏,导致数据块被修改,数据块标志为坏块( corruption )。


Case分享

数据块的 Checksum 值无效是一种常见的物理坏块,当数据库初始化参数 DB_BLOCK_CHECKSUM=TYPICAL(默认值)时,DBWR 进程将数据块写入 disk 时会计算数据块的 Checksum,并且将 Checksum 值记录在数据块的位置 offset 16和17;当从 disk 读取该数据块时,oracle 重新计算数据块的 Checksum,并且与记录在数据块中的 Checksum 做异或运算(Xor),如果异或结果为非0,说明数据块被修改过,数据块为坏块( corruption )。


1. 当前数据库初始化参数配置 DB_BLOCK_CHECKSUM=TYPICAL,因此从 disk 读取数据块时校验 checksum:


SQL> show parameter DB_BLOCK_CHECKSUM

NAME                               TYPE       VALUE

-----------------------           ---------    ------------

db_block_checksum    string    TYPICAL


2. 查询表 dept 时发现有坏块,报错信息 ORA-1578 和 ORA-1110,坏块为 file # 4, block # 133


SQL> select * from dept;

 select * from dept

*

ERROR at line 1:

ORA-01578: ORACLE data block corrupted (file # 4, block # 133)

ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl/users01.dbf'


3. 出现以上错误的同时在 alert log 中也有详细错误信息,这些错误信息说明数据块(file # 4, block # 133)损坏的原因是 checksum 无效。数据块中记录的 checksum 值为 0x8167(这个值是上一次 DBWR 写入磁盘时计算的),读取数据块时重新计算得到的 checksum 是0x8122,checksum值异或运算(Xor)的结果是0x45 ( computed block checksum )。由于两次 checksum 值不同(即异或结果为非0),说明数据块被修改过,数据块为坏块( corruption )。


Alert log错误信息:




4.1 对应的 orcl_ora_20892.trc 中也有数据块的信息,其中数据块上记录的 checksum 值是0x8167(chkval)


Block dump from disk:

buffer tsn: 4 rdba: 0x01000085 (4/133)

scn: 0x0000.0023d69a seq: 0x05 flg: 0x06 tail: 0xd69a0605

frmt: 0x02 chkval: 0x8167 type: 0x06=trans data

Hex dump of block: st=0, typ_found=1


4.2 通过dd也查看数据块中记录的 checksum 值, offset 16,17 对应的是 checksum 值 0x8167


$ dd if=/u01/app/oracle/oradata/orcl/users01.dbf bs=8192 count=1 skip=133 of=/tmp/dd133.out

$ od -x tmp/dd133.out

0000000 a206 0000 0085 0100 d69a 0023 0000 0605

0000020 8167 0000 0001 0000 3807 0000 2fef 000c

^^^^


5. 修复数据坏块的方法可以通过备份恢复或者 DBMS_REPAIR.SKIP_CORRUPT_BLOCKS 跳过坏块。


5.1 方法#1 RMAN数据块恢复:


RMAN> run {blockrecover datafile 4 block 133;}

SQL> select * from dept;


      DEPTNO DNAME          LOC

     ---------- --------------     -------------

        10 ACCOUNTING     DALIAN

        20 RESEARCH       DALLAS

        30 SALES              CHICAGO

        40 OPERATIONS     BOSTON


5.2 方法#2 DBMS_REPAIR.SKIP_CORRUPT_BLOCKS 跳过坏块,然后将 dept 表中的其他数据导出重建表


SQL> alter session set db_file_multiblock_read_count=1;

SQL> execute DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('JAMES','DEPT'); 

SQL> create table dept_new as select * from dept;



---------The  End



如何加入"云和恩墨大讲堂"微信群

搜索 盖国强(Eygle)微信号:eyygle,或者扫描下面二维码,备注:云和恩墨大讲堂,即可入群。每周与千人共享免费技术分享,与讲师在线讨论。




近期文章

分区剪裁特性剖析

oracle标量子查询和表连接改写

利用DMU修改数据库字符集 

UPDATE GLOBAL_NAME为空之后的恢复

深入剖析 ORA-04031 的前世今生

Database Link与GLOBAL_NAMES参数的关系



资源下载

关注本微信(OraNews)回复关键字获取

2016DTCC, 2016数据库大会PPT;

DBALife,"DBA的一天"精品海报大图;

12cArch,“Oracle 12c体系结构”精品海报;

DBA01,《Oracle DBA手记》第一本下载;

YunHe“云和恩墨大讲堂”案例文档下载;




「喜欢文章,快来给作者赞赏墨值吧」
文章转载自彭小波,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

数据库资讯
最新 热门 更多
本月热门
近期活动
全部
暂无活动,敬请期待...
相关课程
全部