Physical and Logical Block Corruptions. All you wanted to know about it. (文档 ID 840978.1)
oracle 物理坏块和逻辑坏块
适用范围
oracle 数据库企业版9.2.0.1-11.2.0.3支持所有平台
oracle定义块故障为物理块故障和逻辑块故障,一般被归纳为内部块故障。
(一)物理块故障
这种块故障一般报错0RA-1578,详细信息需要查看alert
通常包含下面几种情况
1)块头损坏 块头值无效
2)块损坏或不完整
3)块校验值不匹配 checksum
4)块位置不对
5)归零的块
块损坏意味着块头和快尾不匹配,就是说这个块不完整;
consistency value in tail: 0x00780601
check value in block header: 0x8739, computed block checksum: 0x2f00
校验值不匹配(bad checksum )
校验(checksum)一般用来检测自上一次oracle改变之后,其他外部操作(非oracle,可能是操作系统的)对块的改变。从oracle进程DBWR第一次
向磁盘写数据或者第一次加载数据时做校验并记录在块头,当下一次读取时从新计算checksum值并比较以判断块是否损坏。
check value in block header: 0x68a7, computed block checksum: 0x2f00
块位置不对
块头记录的某块的位置信息与实际块位置信息不一致
Corrupt block relative dba: 0x0d805a89 (file 54, block 23177)
Bad header found during buffer read
Data in bad block -
type: 6 format: 2 rdba: 0x0d805b08 ----> Block is different than expected 0x0d805a89
(二)逻辑坏块
当一个块包含有效的checksum和结构,但其块头的下一部分(块内容)损坏,可能引起不同的ORA-600错误,详细的信息不是记录在alert里,
可以通过dbverify来获取详细信息。
逻辑坏块一般包括
1)行被不存在的事务锁定
2)使用的空间总量不等于块的大小
3)avsp bad (available space in the block(可用空间))
4)其他
当启用db_block_checking,可能会产生内部错误ORA-600 [kddummy_blkchk] 或者 ORA-600 [kdBlkCheckError]。
如果启用db_block_checking 并且磁盘上已经存在逻辑坏块,下一次块更新时会标记这个块为软损坏,以后读取这个块将产生ORA-1578错误。在这种情况下,DBVerify会报错DBV-200:Block, dba <rdba>,already marked corrupted"