概念描述
Oracle数据文件的坏块可以分为物理坏块(Physical Block Corruptions)和逻辑坏块(Logical Block Corruptions)
物理坏块指的是块格式本身已经损坏,块内的数据没有任何意义。物理坏块一般是由于内存问题、OS问题、I/O子系统问题或硬件引起的。物理块损坏也可以称为介质块损坏(Media Corrupt Block)。这种类型的块损坏通常由Oracle报告错误ORA-1578,详细的损坏描述打印在警报日志中
物理坏块可以分为以下几类:
1.坏头(Bad header):数据块头(Cache Header)被无效值损坏
2.块有裂缝/不完整(Fractured/Incompleted Block):数据块头和块尾不匹配
断块例子:
Corrupt block relative dba: 0x0380e573 (file 14, block 58739)
Fractured block found during buffer read
Data in bad block -
type: 6 format: 2 rdba: 0x0380e573
last change scn: 0x0288.8e5a2f78 seq: 0x1 flg: 0x04
consistency value in tail: 0x00780601
check value in block header: 0x8739, computed block checksum: 0x2f00
spare1: 0x0, spare2: 0x0, spare3: 0x0
***
Reread of rdba: 0x0380e573 (file 14, block 58739) found same corrupted data
3.块checksum 无效
坏checksum例子:
Corrupt block relative dba: 0x0380a58f (file 14, block 42383)
Bad check value found during buffer read
Data in bad block -
type: 6 format: 2 rdba: 0x0380a58f
last change scn: 0x0288.7784c5ee seq: 0x1 flg: 0x06
consistency value in tail: 0xc5ee0601
check value in block header: 0x68a7, computed block checksum: 0x2f00
spare1: 0x0, spare2: 0x0, spare3: 0x0
***
Reread of rdba: 0x0380a58f (file 14, block 42383) found same corrupted data
4.块放错位置了
块错位例子:
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
last change scn: 0x0692.86dc08e3 seq: 0x1 flg: 0x04
consistency value in tail: 0x08e30601
check value in block header: 0x2a6e, computed block checksum: 0x0
spare1: 0x0, spare2: 0x0, spare3: 0x0
***
5.Zeroed out blocks(详见Doc ID:1545366.1)
逻辑坏块一般是由Oracle Bug等原因引起的,
逻辑坏块指的是块内的数据在逻辑上存在问题,比如说索引块的索引值没有按顺序排列导致的逻辑坏块。逻辑坏块通常包含一个正确的checksum和结构,但是块头以下的部分(块的内容)被损坏,可能引起不同的ORA-600错误。逻辑损坏详细的损坏信息通常不打印在alert告警日志中,但是DBV将报告逻辑损坏的块。
逻辑坏块可以分为以下几类:
① 行被不存在的事务锁定--ORA-600[4512]等
② 使用的空间大小不等于块的大小
③ avsp bad
④ 其它
当db_block_checking开启时,可能会产生内部错误ORA-600 [kddummy_blkchk]或ORA-600 [kdBlkCheckError]。如果启用了db_block_checking,并且该块在磁盘上已经在逻辑上损坏了,那么下一次块更新将把该块标记为软损坏,并且将来读取该块将产生ORA-1578错误。在这种情况下,DBVerify会以错误“DBV-200: Block, dba <rdba>, already marked corrupt”报告这种损坏
常用的坏块检测方法
方法 | 简介 | 语法 |
dbv | dbv工具不能验证redo log,archived log,contor file,rman备份集,只能验证数据文件块。 | 1.文件在操作系统上,dbv file=文件路径 2.文件在asm上, dbv userid=username/password file=asm文件路径 3.验证段,其中segment_id参数格式为:表空间ID,段头所在数据文件号,段头数据块号; select tablespace_id,header_file,header_block from sys_dba_segs where owner='XXX' and segment_name='xxxx'; dbv userid=username/password segment_id=36.12.130 |
analyze | 通过分析数据库对象,为优化器收集数据库对象统计信息。同时也能检查某个表或索引是否存在损坏情况。analyze执行坏块检查,但是不会标记坏块为corrupt,检测结果保存在user_dump_dest目录下的用户trace文件中 | analyze table/index table_name validate structure; |
exp | 对坏块表执行导出操作,会收到相关错误信息(ORA-01578)。exp检测不会发现高水位线以上的坏块,索引中的坏块,数据字典中的坏块 | exp username/password tables=xxx.xxx file=xxx.dmp |
rman | rman可以检查块是否被损坏,如果备份中的数据库中有坏块,那么将会收到错误。 | backup validate check logical database archivelog all;针对逻辑块 backup validate database archivelog all;这个指令是针对于物理块 |
参考文档
Physical and Logical Block Corruptions. All you wanted to know about it. (Doc ID 840978.1)
https://cloud.tencent.com/developer/article/1624450
标签:总结,header,0x0,损坏,oracle,file,坏块,block From: https://blog.51cto.com/u_13482808/6929338