Oracle数据块损坏知识

上传人:ldj****22 文档编号:35463531 上传时间:2018-03-16 格式:PDF 页数:52 大小:2.59MB
返回 下载 相关 举报
Oracle数据块损坏知识_第1页
第1页 / 共52页
Oracle数据块损坏知识_第2页
第2页 / 共52页
Oracle数据块损坏知识_第3页
第3页 / 共52页
Oracle数据块损坏知识_第4页
第4页 / 共52页
Oracle数据块损坏知识_第5页
第5页 / 共52页
点击查看更多>>
资源描述

《Oracle数据块损坏知识》由会员分享,可在线阅读,更多相关《Oracle数据块损坏知识(52页珍藏版)》请在金锄头文库上搜索。

1、ParnassusData 诗檀软件 Oracle数据库修复专家 Maclean Liu Oracle数据块损坏知识 Know More about Oracle Database Block Corruption 古希腊的Delphi(世界中心),屹立着Parnassus Mount(诗檀山),山上有一座阿波罗神庙,庙中住着 女祭司(Oracle) Oracle Data Block Oracle中最小I/O单位 RDBMS具体存放数据的区域 一个Block对应磁盘上的一定区域,可能跨 多个磁盘 微观的说,空间分配以块为单位 数据块 数据库 Oracle Block的构成 主要由Cache层

2、,事务层和数据层组成 Cache层 事务层 数据层 Tail Oracle Block构成 Cache层 Kcbh Cache层包含用来检测块损坏的信息 Cache层的chkval_kcbh用来确认,上一次的写入到磁盘,到现在读取出来磁盘上 的Block的内容是否一致 Cache层存放的信息 本数据块存放何种数据type_kcbh(Data,Index) RDBA和格式版本 本数据块的更新情况 几乎所有的数据块都有Cache层,KCBH Oracle Block构成 事务层 ktbbh 在本数据块上执行着的 或者执行过的事务信息 存放 SCN (System Change Number) IT

3、L 一种事务列表 ktbbhitl 存放的数据类型 ktbbhtyp , KDDBTINDEX代表索引 , KDDBTDATA 代表数据 ktbbhflg , MSSM or ASSM, KTBFONFL or KTBFBSEG 不是每个块都有ktbbh, 例如Undo block就没有 ktbbh ITL(Interested Transaction List) XID:ktbitxid 事务ID UBA: 指向事务最后一次修改对应的Undo Flag:是否提交了,提交的情形 C、B、U、T Lck: 在本数据块锁住的行数 Scn/Fsc: commit scn或control scn _k

4、tbitfsc、 _ktbitwrp、ktbitbas Oracle Block构造 数据层 数据的存储信息 数据头信息kdbh Table Direcotry kdbt , 针对簇表 有多条记录 Row Directory kdbr ,记 录了每一个row piece的块 内偏移量 Row piece 数据行片,一 个row piece最多255字段, 因为CC column count是单 字节最大0xFF 根据存储数据类型的不同, 其结构也会有区别 kdbh 数据头信息 kdbhflag bit位, KDBHFFK 0x01 Flushable Key kdbhntab Number o

5、f tables in the table index kdbhnrow Number of rows in the row index kdbhfrre first FRee Row index Entry kdbhfsbo Free Space Beginning Offset kdbhfseo Free Space Ending Offset kdbhavsp AVailable SPace in the block kdbhtosp TOtal Space that will be available Table Directory kdbt kdbtoffs 对应表记录的偏移量 kd

6、btnrow 对应表在本块的行数 通常情况下一张表仅仅有一条kdbt记录 当时簇表Cluster Table情况下,一个块中存放多 张表记录,KDBT中有多条记录 Row Directory kdbr 一个kdbr数组,每一个成员为2个字节的signed bytes 每一个成员代表一行数据的块内相对偏移量 相对偏移量从数据层的起始位置开始 相对偏移量+环境偏移量=块内的绝对偏移量 数据块的大小 默认数据块的大小取决于建库时的DB_BLOCK_SIZE 可选项为 2k,4k,8k,16k,32k 默认数据块大小在建库后不可修改 可以混用非标准块大小的表空间,例如8k默认块 大小下建16k大小的表

7、空间 注意:非官方的看法是8k是最稳定,测试最多的 块大小。 少数情况下非8k的Block Size更容易触 发部分BUG。 数据块的损坏 什么是Oracle数据块损坏? 根据不同的情况,可以分成三种: 物理损坏 Physical Corrupt 逻辑损坏 Logical Corrupt 写丢失 Lost Write 造成数据块损坏的原因 存储/硬盘断电,机械老化故障 卷管理软件或文件系统bug OS I/O API bug 人为的误操作 dd/lvm/bbed Oracle RDBMS/ASM自身的bug,越来越少了 存储/硬盘故障 右图为36个月的硬盘留任率 一些案例: ORA-1578

8、Transient Corruption Caused by Parity Error on EMC DMX4 (Doc ID 1486903.1) ORA-1578 Data Block Corruptions when using EMC Storage. Blocks with 0xc9 byte (Doc ID 1323108.1) Database Corruption due to Lost IO on Hitachi storage. ORA-600 kdsgrp1 ORA-1499 ORA-1410 ORA- 600 3020 (Doc ID 1512717.1) 卷管理软件或

9、文件系统bug 一些案例: ORA-354 Redo log corruption when using Xisgo Driver (Doc ID 1498389.1) ORA-1578 ORA-353 ORA-19599 Corrupt blocks with zeros when filesystemio_options=SETALL on ext4 file system using Linux (Doc ID 1487957.1) ORA-1578 Misplaced blocks against datafiles stored in NFS filers (Doc ID 15251

10、08.1) ORA-1578 ORA-354 ORA-600 3020 Misplaced blocks by Symantec / Veritas after adding LUN (Doc ID 1323532.1) ORA-1578 Block overwritten with string “DiskDescription cyl alt hd sec” when using Symantec / Veritas (Doc ID 1313454.1) Block Corruption (ALL ZERO) detected after reclaiming space on Verit

11、as Filesystem (Doc ID 1587427.1) 遇到过的VxCFS问题: 32位指针问题导致内存泄露 卷同步存在漏洞,将实际未完成同步的数据返回给Oracle使 用 数据块损坏的影响 乐观:不发生显性错误,或仅少量SQL报错 悲观:业务几乎不可用,大量ORA-1578、ORA- 8103、ORA-1410错误出现,或者数据库干脆打不 开 部分数据可能丢失 数据库宕机 长时间的数据恢复流程,带库恢复几T数据? 上报 保监会、银监会? 数据块损坏检测参数 DB_BLOCK_CHECKSUM 三种不同作用的检测 保护机制,但都不负责修复 现有问题。 DB_BLOCK_CHECKSU

12、M负责控制块的cache层的 chkval_kcbh是否在块被写出时计算并写入到磁盘 中 BBED sum Check value for File 0, Block 500: current = 0x5327, required = 0x5327 BBED p chkval_kcbh ub2 chkval_kcbh 16 0x5327 DB_BLOCK_CHECKSUM Oracle 实实例例 Buffer Cache DBWn 计算checksum 即 chkval_kcbh,并写出 数据块从buffer cache中写出时 DB_BLOCK_CHECKSUM 数据块被从磁盘读取到buff

13、er cache中时 Oracle 实实例例 Buffer Cache 验证块内的 checksum和计算值 是否一样 DB_BLOCK_CHECKSUM 检验发现checksum和计算值不一样 Oracle 实实例例 Buffer Cache 验证块内的 checksum和计算值 是否一样 物理损坏 检测到物理损坏 发现损坏 ORA-01578报错 DB_BLOCK_CHECKSUM 通过一个校验值来检测出块损坏: 由于断电或硬盘故障,一个块仅写出了一半或更少内 容,此时chkval必然不等于整个块checksum 从写出到下一次读取的时间中硬盘发生了故障,块中 的部分内容不正确 DB_BL

14、OCK_CHECKSUM控制是否计算和写 chkval_kcbh,如果不写则chkval_kcbh为0000, 读取时也不做检测 DB_BLOCK_CHECKSUM 默认值 TRUE(10g),Typical(11g) 当块要写出到磁盘时,DBWn从块中的每一个字节计算 checksum并存放到块头的chkval_kcbh 有了checksum后,Oracle能判断由底层磁盘存储系统 引起的损坏 每一次数据块从磁盘中被读取都会检查checksum 更新过程如下: 服务进程修改数据块,checksum被置0 DBW负责计算checksum并写出块 在上述改数据块和checksum之间存在时间,D

15、BW不清楚这中 间的问题,也不负责 db_block_checksum=TRUE Block#=X Chkval=A Server process reads block X. Checksum is calculated and compared with the one in the block header. Block is modified and checksum=0 DBWn later calculates a new checksum , stores it in block header and writes the block Buffer cache Datafiles Block#=X Chkval=0 Block#=X Chkval=B db_block_checksum=FULL Block#=X Chkval=A Server process reads block

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号