ORACLE和UNIX上的块损坏 block corruption

如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 13764045638 QQ号:47079569 邮箱:service@parnassusdata.com

数据库检验和决定了DBWn和直接加载器是否会计算检验和(从存储在该块的所有字节计算得来),也决定了在将其写入磁盘时是否将它存储到每个数据块头的缓存区,只有该参数正确并且最后一次该区块的写入存储了检验和时,块区读取时,检验和才得以证实,如果设置为FULL,数据库块检验和同样会导致内存损坏,不能传递到磁盘。

The _db_block_cache_protect=true protects the cache layer from becoming corrupted.

该参数会阻止某些损坏到达磁盘,虽然可能会导致数据库实例的前景的崩溃,这将有助于在缓存区捕捉偏离的写入,当一个进程试图不顾SGA中缓冲区的大小写入时,首先会因为码冲突出现失败。

如果数据库写入进程在将块写入磁盘之前检测到高速缓存中的损坏块,它会发出错误信号,并使数据库实例崩溃,损坏块绝不会写入到磁盘,收到错误信号后,简单地尝试重启数据库实例,毫无疑问,这是一个避免块损坏的一个昂贵的方法,但是,损坏产生后的解决方法会更昂贵。

案例三

    块损坏产生的第三个原因是操作系统不服务于所请求的I/O系统,为返回错误代码Oraclelseek() read()的调用被检查,此外,Oracle检查以查看被read()系统调用所读取的字节数,以确保块大小或块大小的倍数被读取,由于这些检查看起来是成功的,Oracle便假设该直接读取成功了,经完整性检查,RDBA是不正确的,对数据库的操作请求失败,所以,I/O  读取请求实际上从未发生,在这种情况下,发现的RDBA可以指向不同文件的区块。

案例四

块损坏的另一个原因是从同一设备中读取了错误的区块。这是非常繁忙的磁盘引起的典型的问题,在一些情况下,区块读取在一区块停止,但是却能涵盖几百个区块,因为当磁盘很繁忙并且处于压力大的状态下,这种情况才会发生,所以,尝试在多个磁盘中扩展数据文件,以保证磁盘驱动器能支持负载。

    在第三种和第四种情况下,该数据库文件不会发生物理损坏,操作可以再次尝试,并能获得成功,大多数诊断测试不会显示关于操作系统或硬件的任何毛病,但是,问题往往是有关操作系统和硬件的问题。(Velpuri, 1995)

所以,是什么原因导致操作系统调用出现这样的行为?公司又将怎样尽力降低风险?我了评定这些问题,另外了解UNIX的工作方式是必需的。

为了提高性能,UNIX 供应商已经在文件系统上实现了很多功能,文件系统管理大缓存I / O缓冲区的大缓存,称为缓冲区高速缓存,此缓存使UNIX能够优化读取和写入操作,一个程序写入数据时,文件系统将数据存储在缓存区而不是立刻写入磁盘,在之后的某个时间点,系统会将该数据连同在该缓存区缓存的其他数据一起发送到磁盘驱动器,换句话说,缓冲区高速缓存允许磁盘驱动器按进度分批进行磁盘操作,它可以实现更大的调用,使用更加优化的技术从而使磁盘访问更加高效,这被称为后写。

当程序读取数据时,系统首先检查缓冲区高速缓存,观察想要的数据是否已存在,如果数据已存在,文件系统则不需要访问磁盘上的这些区块,它只是为用户提供了在其缓冲器中找到的数据,而无需等待一个磁盘驱动器;如果缓存区不存在想要的数据,文件系统仅仅需要读盘。为了进一步提高效率,文件系统假定该程序将连续从磁盘一次读取该文件并读取若干区块,这增加了未来读取操作的数据出现在缓存区的可能性 (Loukides, M.,1990),同时这也增加了块损坏发生的可能性。

当文件系统变得繁忙,缓冲区被读取、修改、写入和老化时,内核读取和写入错误区块的机会就会增加,同时,需要读取和写入磁盘的方案越复杂,操作失败的可能性会越大。

    虽然字符设备的读写程序有时会使用与其区块相对应的策略程序来直接在该设备和用户地址之间传送数据,但是,UNIX 内核使用策略接口来发送高速缓存缓冲区和设备间的数据,该策略程序可能会在一个设备的工作清单上等待I/O 工作,或者为规划I/O 工作做更复杂的安排,驱动程序可以设置数据传输的一个物理地址,合适的情况下多个物理地址, UNIX内核传递一个缓冲头的地址到驱动策略程序,该缓冲头包括向该设备或从该设备传送数据的一系列地址和尺寸,这也是交换操作系统的工作方式,对高速缓存缓冲区来说,内核从一个地址传送数据,交换时,内核从多个数据地址传送数据,如果数据从用户地址空间拷贝或拷贝到用户地址空间,驱动器必须锁定存储器中的进程直到I/O 传递完成。

    只有当内核等待缓冲区和磁盘上间的I/O 操作完成时,内核才会失去对缓冲区的控制, 可以设想,磁盘驱动器已损坏,不能中断CPU,从而防止内核不断释放缓冲器,有些进程可以监控这些情况下的硬件,使区块清零,对于坏磁盘作业向内核返回一个错误。 (Bach, 1990 52)

UNIX层面有几个实用程序将检查磁盘坏块,清零所发现得损坏的块,这些实用程序意识不到出问题的区块可能是一个Oracle RDBMS块,并错误地清零,在SilberschatzGalvin 1994的文章中,作者考虑了电脑死机可能带来的影响,在这种情况下,所打开文件的表一般会丢失,若打开文件的目录也会发生变化,这一事件会导致文件系统出现不一致的结构,通常,一个特殊的程序在重启时运行,检查和纠正磁盘不一致的问题。

一致性检查比较目录结构中和磁盘的数据块中的数据,并尽力修复所发现的不一致问题。(Silberschatz, Galvin, 1994) 这通常会导致块的重新格式化,从而造成Oracle块信息的移除,这无疑会造成Oracle损坏。

所有的操作系统都需要硬件监控,认识到这一点是重要的,硬件监控器可以感测到总线上的电信号,即便在高速运转时也能准确地记录,硬件监控器一直监控系统,即便在发生故障的情况下,所以,可以被用于调试系统。(Jain, 1991 99) 这些工具可以帮助找出问题出现的原因 ,检测经常造成损坏的问题,如,控制器错误和媒体断层。

   在任何情况下,块出现损坏的机会很多,要么在磁盘上,要么在高速缓存缓冲区,有时,修复损坏甚至会导致块损坏的几率变大。

结论

   数据块损坏是所有操作系统上一直存在的问题,特别是UNIX, 需要考虑的损坏类型和损坏原因很多,先进的系统配置会增大损坏的几率,硬件问题是损坏发生的一个共同原因,.当收到块损坏错误时,要记住,有一些不是物理损坏而是内存损坏,不会被写入磁盘。

   Oracle客户支持发布了很多关于块损坏问题的公告,当损坏发生时可以帮助恢复剩下的数据,如果一台机器上发生了块损坏,一定要找出损坏类型,并建立改正计划。

参考文献:

[1]  Bach, M. (1990). The Design of the UNIX Operating System.

                      The I/O Subsystem  328.

[2]  Corey, M., Abbey, M., Dechichio, D. (1995).  Tuning Oracle 52.

[3]  Jain, R. (1991). The Art of Computer Systems Performance Analysis. 99

[4]  Loney, K. (1994).  Oracle DBA Handbook.   23.

[5]  Loukides, M., (1990) System Performance Tuning. 161-162.

[6]  Millsap, C. (1995). Oracle7 Server Space Management. 1-2.

[7]  Presley, D. (1993).  Data Block Corruption Detection. Oracle Corporation.

[8]  Silberschatz A., Galvin P. (1994)  Operating System Concepts. 404.

[9]  Stevens, W. (1990). UNIX Network Programming. 163.

[10] Velpuri, R. (1995).  Oracle Backup and Recovery Handbook. 286

Comment

*

沪ICP备14014813号-2

沪公网安备 31010802001379号