Oracle 数据文件的坏块可以分为物理坏块(Physical Block Corruptions)和逻辑坏块(Logical Block Corruptions)。坏块通常是通过Oracle的ORA-01578错误报告出来的,详细的损坏描述会在告警日志中打印出来。
物理坏块
物理坏块指的是块格式本身已经损坏,块内的数据没有任何意义。物理坏块一般是由于内存问题、OS问题、I/O子系统问题或硬件引起的,逻辑坏块一般是由Oracle Bug等原因引起的。物理块损坏也可以称为介质块损坏(Media Corrupt Block)。物理坏块可以分为以下几类:
- 坏头(Bad header):数据块头(Cache Header)被无效值损坏
- 块有裂缝/不完整(Fractured/Incompleted Block):数据块头和块尾不匹配
- 块的块校验和(checksum)无效
- 块的位置错误(Block Misplaced)
- 归零的块(Zeroed out blocks)
逻辑坏块
逻辑坏块指的是块内的数据在逻辑上存在问题,比如说索引块的索引值没有按顺序排列导致的逻辑坏块。逻辑坏块通常包含一个正确的checksum和结构,但是块头以下的部分(块的内容)被损坏,可能引起不同的ORA-600错误。逻辑损坏详细的损坏信息通常不打印在alert告警日志中,但是DBV将报告逻辑损坏的块。
逻辑坏块可以分为以下几类:
- 行被不存在的事务锁定
- 使用的空间大小不等于块的大小
- avsp bad
- 其它
坏块的识别
坏块通常是通过Oracle的ORA-01578错误报告出来的,详细的损坏描述会在告警日志中打印出来。例如,以下的告警日志表明数据文件 11 的块 110 被损坏了:
ORA-01578: ORACLE data block corrupted (file # 11, block # 110)
ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'
也可以通过以下的 SQL 语句来识别坏块:
SELECT
file_id,
relative_fno,
block_id,
status
FROM
v$datafile_corrupted_blocks
WHERE
status = 'CORRUPTED';
坏块的处理
对于有备份的数据库,可以通过恢复来修复坏块。对于没有备份的数据库,可以通过以下的方法来处理坏块:
- 跳过坏块:使用 DBMS_REPAIR.SKIP_CORRUPT_BLOCKS 来跳过坏块,这样之后的查询就不会访问到坏块。
- 重建对象:如果坏块所在的对象是表或索引,可以尝试重建对象来修复坏块。
- 重建数据库:如果坏块分布在多个对象中,可以尝试重建数据库来修复坏块。
坏块的预防
为了尽量避免坏块的发生,可以采取以下措施:
- 使用高质量的硬件
- 正确配置操作系统和数据库
- 定期对数据库进行备份
总结
坏块是数据库中的一个常见问题,可以通过识别和修复来解决。通过采取预防措施,可以尽量避免坏块的发生。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




