Oracle中的坏块处理技术之案例篇

 

一天在公司与几位负责紧急救援电话支持服务的同事聊天,当我询问客户主要有哪些求救电话时,他们告诉我最多的求救电话是两类:一类是数据库宕机或挂起,特别是RAC数据库出现宕机,另外一类则是数据库坏块问题。...



一天在公司与几位负责紧急救援电话支持服务的同事聊天,当我询问客户主要有哪些求救电话时,他们告诉我最多的求救电话是两类:一类是数据库宕机或挂起,特别是RAC 数据库出现宕机,另外一类则是数据库坏块问题。前者在我意料之中,而后者则有点出乎我的意料。但仔细一想,事实的确可能如此。大家千万别小看数据坏块的处理,从危害程度而言,几个小小数据坏块的确可能导致客户核心数据不可访问,甚至丢失。而从技术角度而言,数据坏块处理涉及的内部机制和处理方法是非常复杂的。为此,Oracle有若干专题文章是讲述数据坏块处理的。

本章我们先从若干案例介绍起,先让大家从不同层面感触一下数据库坏块处理的多样性和复杂性,然后将详细介绍坏块的处理流程,坏块的定位和相关解决方案,例如使用DBMS_REPAIR包或设置10231事件、ROWID扫描方法等。

可怕的数据库坏块

案例1:逻辑坏块导致的坏块

第一个案例来自于国税某系统,笔者在《品悟性能优化》的第十七章曾经“绘声绘色”地叙述过。本书再次摘要该案例主要内容如下:

  • 故障现象和原因
首先,了解到共有18个数据坏块,三个表核心业务表分别有一个数据坏块,其他15个坏块为索引。

其次,了解硬件特别是存储并没有报错,说明很可能是逻辑坏块。

再其次,了解到前一天的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损坏导致的坏块

  • 故障现象和原因
该案例来自于某省移动BOSS系统。具体故障现象表现为:数据库实例宕机,数据库也异常关闭。在客户请求Oracle紧急现场救援服务,Oracle工程师赶到现场之后,经过分析alert.log日志发现:Online Redo Log出现坏块,Oracle在发现Redo Log校验失败之后,为保护数据,Oracle主动关闭数据库实例和数据库。

在硬件公司的积极配合下,后来发现导致该故障的最终原因是数据库服务器的CPU损坏,导致Oracle的Online Redo Log被写坏。

  • 处理方案和结果
Oracle工程师在现场评估了问题原因和影响范围之后,最终确定通过RMAN进行数据库的不完全恢复,即只恢复到出现坏块的Online Redo Log的前一个。该数据库已经达到TB级,为此花费了20多个小时才完成了该核心系统的不完全恢复。由于恢复期间,数据库处于Mount状态,意味着业务不得不停顿了20多个小时。更严重的是,由于是不完全恢复,导致丢失了一个多小时的业务数据。

事后,本人在与承担具体抢救任务的同事聊天时,他坦言:其实他当时是恢复到出现坏块的Online Redo Log的前两个,而不是前一个。原因是他担心前一个也有坏块,而Oracle可能没有及时检查出来。如果出现这种不幸,那Oracle数据库还是无法打开,可能要再次进行恢复。他说宁可客户数据多丢一点,也要保证数据库尽快顺利地打开,及时恢复正常业务。他当时还很神秘地告诉我:千万别告诉客户哦,客户还以为只丢了一个日志文件的数据呢。抱歉,哥儿们,今天在这儿泄露你的秘密了。呵呵。

案例3:Oracle Bug导致的坏块

  • 故障现象
2011年3月21日5:10分左右,某银行系统出现异常,具体情况如下:

  • 数据库在预分配空间时出现异常,报空间分配失败
  • 账务流水表出现数据块逻辑读写错误,不可读写,进而中断交易。
  • smon后台进程不断尝试恢复损坏的数据块,恢复后将实例2自动关闭。
  • 处理方案和结果
Oracle公司工程师在分析故障原因之后,采取了如下措施:

  • 关闭ORACLE数据库一致性保护校验(初始化参数:db_block_checksum改为false)
  • 删除账务流水表
  • 重建账务流水表
至10:05分,最终恢复了正常业务。

在事故处理过程中,该银行还进行了恢复丢失的账务流水数据、数据追加、数据库多次全库备份、数据一致性验证等工作,在此不赘述。

  • 事故原因分析
根据Oracle公司提交的故障处理报告,最终确定导致数据库出现逻辑坏块的根本原因是Bug所导致。

  • 由故障引发的架构性改造
可见,上述数据坏块故障导致了该银行某系统约5小时的业务停顿。如何有效防范同类事故的发生,引起该银行各级领导和技术人员高度关注,并确定在已经通过存储镜像技术建立同城容灾系统基础上,开展数据库备援系统建设。为此,确定了建设总目标如下:

  • 备援系统将与生产系统建立在同一机房。即不是地理意义上的容灾系统。
  • 在发生类似上述数据坏块故障时,并不是切换到容灾系统。事实上,通过存储镜像技术建立的容灾系统,无法防范数据坏块的传播。
  • 在发生类似上述逻辑坏块故障时,为降低故障影响面,也不是将生产系统直接切换到备援系统。而是优先考虑通过备援系统,快速抢救和恢复被损坏数据。
  • 如果故障影响面较大,才考虑将生产系统直接切换到备援系统。
诗檀软件
诗檀软件紧急响应服务支援覆盖中国本土地区,提供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


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册