Oracle中的坏块处理技术之案例篇
一天在公司与几位负责紧急救援电话支持服务的同事聊天,当我询问客户主要有哪些求救电话时,他们告诉我最多的求救电话是两类:一类是数据库宕机或挂起,特别是RAC数据库出现宕机,另外一类则是数据库坏块问题。...
一天在公司与几位负责紧急救援电话支持服务的同事聊天,当我询问客户主要有哪些求救电话时,他们告诉我最多的求救电话是两类:一类是数据库宕机或挂起,特别是RAC 数据库出现宕机,另外一类则是数据库坏块问题。前者在我意料之中,而后者则有点出乎我的意料。但仔细一想,事实的确可能如此。大家千万别小看数据坏块的处理,从危害程度而言,几个小小数据坏块的确可能导致客户核心数据不可访问,甚至丢失。而从技术角度而言,数据坏块处理涉及的内部机制和处理方法是非常复杂的。为此,Oracle有若干专题文章是讲述数据坏块处理的。
本章我们先从若干案例介绍起,先让大家从不同层面感触一下数据库坏块处理的多样性和复杂性,然后将详细介绍坏块的处理流程,坏块的定位和相关解决方案,例如使用DBMS_REPAIR包或设置10231事件、ROWID扫描方法等。
可怕的数据库坏块
案例1:逻辑坏块导致的坏块
第一个案例来自于国税某系统,笔者在《品悟性能优化》的第十七章曾经“绘声绘色”地叙述过。本书再次摘要该案例主要内容如下:- 故障现象和原因
其次,了解硬件特别是存储并没有报错,说明很可能是逻辑坏块。
再其次,了解到前一天的RMAN备份顺利完成,意味着RMAN备份集已经包含了数据逻辑坏块。
- 处理方案和结果
- 首先不能直接通过RMAN进行恢复,因为备份集很可能已经包含了逻辑坏块,如果恢复只能同样恢复成坏块。
- 针对索引,采取重建索引到新的数据文件的方案,并获得了成功。
- 针对三个核心业务表,先采取了设置event=”10231 trace name context forever, level 10”,或者通过SKIP_CORRUPTION_BLOCKS方法,试图将坏块之外的数据读出来,但都没有成功。
- 与应用开发人员进一步沟通,发现其中一张表为汇总统计表,于是采取了重新运行汇总程序的办法,重新生成了该表并移到一个新的物理位置。
- 为减少数据损失,对剩余2张表采取了ROWID Range Scan技术。其中一个表获得了成功,但1000多万的表丢失了4条记录。而另外一个表却没有成功。
- 针对最后一张表,只好采用了最后一个不得已的招术:Oracle的内部技术DUL。最终也基本获得了成功,400多万的表丢失了10多条记录。
案例2:CPU损坏导致的坏块
- 故障现象和原因
在硬件公司的积极配合下,后来发现导致该故障的最终原因是数据库服务器的CPU损坏,导致Oracle的Online Redo Log被写坏。
- 处理方案和结果
事后,本人在与承担具体抢救任务的同事聊天时,他坦言:其实他当时是恢复到出现坏块的Online Redo Log的前两个,而不是前一个。原因是他担心前一个也有坏块,而Oracle可能没有及时检查出来。如果出现这种不幸,那Oracle数据库还是无法打开,可能要再次进行恢复。他说宁可客户数据多丢一点,也要保证数据库尽快顺利地打开,及时恢复正常业务。他当时还很神秘地告诉我:千万别告诉客户哦,客户还以为只丢了一个日志文件的数据呢。抱歉,哥儿们,今天在这儿泄露你的秘密了。呵呵。
案例3:Oracle Bug导致的坏块
- 故障现象
- 数据库在预分配空间时出现异常,报空间分配失败
- 账务流水表出现数据块逻辑读写错误,不可读写,进而中断交易。
- smon后台进程不断尝试恢复损坏的数据块,恢复后将实例2自动关闭。
- 处理方案和结果
- 关闭ORACLE数据库一致性保护校验(初始化参数:db_block_checksum改为false)
- 删除账务流水表
- 重建账务流水表
在事故处理过程中,该银行还进行了恢复丢失的账务流水数据、数据追加、数据库多次全库备份、数据一致性验证等工作,在此不赘述。
- 事故原因分析
- 由故障引发的架构性改造
- 备援系统将与生产系统建立在同一机房。即不是地理意义上的容灾系统。
- 在发生类似上述数据坏块故障时,并不是切换到容灾系统。事实上,通过存储镜像技术建立的容灾系统,无法防范数据坏块的传播。
- 在发生类似上述逻辑坏块故障时,为降低故障影响面,也不是将生产系统直接切换到备援系统。而是优先考虑通过备援系统,快速抢救和恢复被损坏数据。
- 如果故障影响面较大,才考虑将生产系统直接切换到备援系统。
诗檀软件
诗檀软件紧急响应服务支援覆盖中国本土地区,提供7*24小时汉语技术支持,涵盖Oracle数据库产品:ORACLE Database/ASM和MYSQL。服务包括但不限于:
针对无法打开的ORACLE数据库,实施特殊的手工修复
基于PRM-DUL专业ORACLE数据库恢复工具恢复问题数据库中的数据
修复数据库中的坏块
解决关键的ORA-00600(600错误)问题
实施ORACLE数据库的崩溃恢复/修复
解决关键的ORACLE数据库性能问题,解除性能瓶颈
针对ORACLE的致命BUG提供解决方案
实施ORACLE补丁安装
协助解决紧急的ORACLE硬件产品故障
当你遇到如下恢复需求时,都可以找我们恢复:
意外DROP了表:请第一时间关闭应用和数据库实例,并对所有数据文件做一个备份。
意外DROP了column字段
意外truncate了表:与drop表类似
意外drop tablespace: 不管是drop tablespace带了including contents 还是including datafiles,都有机会恢复
丢失了system表空间数据文件:可以基于用户数据表空间尽可能恢复数据
只剩下部分数据文件: 与丢失了system表空间类似,只要你要的数据在对应数据文件里,我们就能挖掘出来
Oracle数据字典或启动自举对象bootstrap objects存在问题
数据库只剩下部分备份文件,而且这些备份文件可能丢失归档日志archivelog、丢失增量备份,所以这些备份也是不一致的。
ASM diskgroup disk header/metadata存在损坏,导致ASM diskgroup 无法成功mount
===========================================================
数据岛IT学院
http://www.dbdao.com 数据岛IT学院是诗檀软件旗下的IT教育品牌,提供 视频、题库、在线学习SQL/NOSQL模拟平台。引导式IT在线教育,关注大数据科学。扫码关注dbDao 微信公众号:
关注 AskMaclean
微信扫一扫关注公众号