1、组成数据文件的Oracle数据块会出现讹误2、DBA经常遇到讹误、需要能够检测、修复讹误3、联机日志、归档日志、控制文件也会出现讹误,需要通过复用来解决4、保证不丢失数据是DBA的职责块讹误及其原因介质讹误逻辑讹误介质讹误1、内容没有任何意义的数据块2、具体表现在数据块的格式不对(创建数据文件的时候,数据文件会被格式化为若干数据库块,根据为每一个表空间指定的数据块的大小进行格式化。创建对象,对象被分配区间,当对象的high-watermark进入这个新区间的时候,区间内的数据块需要进行二次格式化,因为块被分配给了特定的段,因此二次格式化的时候,要求数据块按照特定段的要求进行格式化。)格式不对(不满足一次格式化的要求或者二次格式化的要求)就意味着介质讹误,这样的数据块是没有任何意义的。逻辑讹误数据块的格式化正确(具有正确的头部区域以及数据区域)内部内容不一致例如:表中的每一个数据块的头部包含了一个说明每条记录起始位置的记录目录,在试图通过记录目录查找某条记录的时候,发现这条记录不存在。这就是一个逻辑讹误。块讹误的原因1、硬件、操作系统原因2、IO问题:在数据块传输的过程中受损数据块从数据文件写至内存(服务器进程接收)数据块从内存写至数据文件(DBWr负责)3、内存错误(假货OEM、水货、拆机件),数据块也被写入了数据文件4、逻辑讹误通常也与硬件有关5、极少情况下,Oracle自身存在bug而导致Oracle创建了不一致的数据块(打补丁)容易出现问题的地方1、IO2、磁盘、内存3、Oracle自身的bug与块讹误相关的参数DB_BLOCK_CHECKSUM:默认为TRUE数据块写入磁盘,DBWr进程计算这个数据块的校验和、并将校验和写入数据块的头部。服务器进程读取某个数据块的时候,如果存在校验和,那么就读取校验和、并对数据块重新计算校验和,两个校验和进行比较,确认数据块的讹误。在读和写的时候,数据块的讹误就能够被检测出来。这个方法对数据库的性能影响很小,适合在可靠硬件上运行即使这个参数为FLASE,SYSTEM表空间还是会启用校验和计算这个参数有助于检测由磁盘或IO系统引入的错误DB_BLOCK_CHEKING:默认是FALSE,如果设置为TRUE,会对性能有影响(逻辑读时,会影响性能)这个参数设置为TRUE后,Oracle进程每次访问指定数据块的缓冲区时(数据库高速缓存),都会检测该数据块的一致性。数据块在内存中出现错误,马上就检测出来,主要检测内存错误。可能占用10%的处理能力不管是否设置,总是对SYSTEM表空间启用数据块检查Oracle采用了数据库高速缓存,大大的提高了性能,在100次的数据访问中,99次以上是访问数据库高速缓存,只有不到一次访问数据块,因此启用上面的数据块检测会大大的增加负载。检测块讹误1、用户在读取讹误的数据块时可能会发现讹误2、DBA应该先于用户检测到讹误、某些应用程序能够帮助我们实现这一目标模拟错误的发生我们可以通过编辑器编辑数据文件(某个对象的数据块)来模仿介质和逻辑错误一旦一个对象的数据块出现讹误,我们在select这个对象的时候,系统会报错:ORA-01578,这个消息说明存在讹误数据块,同时将文件ID、blockID列出来。进一步查看告警日志,找到这个数据块所属的对象号(OBJN)BBED工具可以直接编辑ORACLEBLOCK例如:对象为index,可以考虑重建有些数据文件在数据块出现问题以后,只有在服务器进程读取的时候才发现讹误。因此DBA如何较早的发现讹误问题、及时的解决是很重要一个工作。被客户发现问题是不好的一个情况。DBVERIFY程序(Oracle自带软件)1、在操作系统下面执行的一个程序2、验证数据文件正在使用的数据文件用户托管备份的映像副本RMAN生成的映像副本不能验证联机、归档、控制文件可以位于文件系统中可以位于ASM中(oracle的自建文件系统)可以位于原始设备中(裸设备)(需要指定起始和结束块)1、一个数据块被称为一个page2、Influx表示遇到了DBWr进程正在写入的数据块,dbv重新读取该数据块,不是问题如果数据库块有问题,会标识出来。数据块讹误的监测注:这个应用程序适合用户托管的备份,RMAN备份有自己的验证操作。ANALYZE命令1.主要是收集优化器统计量(为了找出某条SQL语句的最有效的执行方式)统计信息对CBO很重要2、还可以查找某个表或者某个索引是否讹误3、validatestructure对于分区表来说,会检查记录是否位于正确的分区。4、validatestructure会计算活动索引的空间比例,因为已删除记录对应的索引会一直存在,如果非活动索引空间占用比例过高,那么需要重建索引。当需要监测很多表的block时:Select‘analyzetable’||’object_name’,’’fromtablespacenameWhereobject_name=nameDBMS_REPAIR程序包1、由一组过程组成(包的特点)2、检查对象是否存在问题,并使其可用具体的实施过程1、创建一个该程序包用来存储输出的表创建一个名字为REPAIR_CORRUPT_TAB的表,用来存储输出名称必须具有前缀REPAIR_,需要SYS模式如果发现指定表中的任何数据块存在讹误,这个数据块以及被影响对象的详细信息会被写至修复表,修复表中还会修复建议一般的建议是:markblocksoftwarecorrupt具体的操作过程是:1、标记讹误块(为了可以忽略后导出数据,此时存在数据丢失)2、指示Oracle忽略讹误块3、表可以访问,但是丢失数据_name(缺少)对于索引来说,执行一次ALTERINDEX…REBUILDONLINE上面的方法联机的实现了表的修复,但是代价却是数据的丢失。在做上面的操作的时候,一定要根据具体的业务情况来分析丢失数据的风险和是否可接受。如果是不能接受数据丢失,那么只能采用还原恢复的方式。使用RMAN恢复讹误块(RMAN特性使用Oracleblock)1、用户管理的备份操作不能进行块级恢复2、如果非常大的数据库,例如1000G以上的数据库,某个数据块出现问题,具体的恢复流程如下将受损的文件脱机从发生讹误前生成的备份中还原受损的文件完全恢复受损文件将恢复后的文件联机3、没有丢失任何数据,但是停机时间对用户产生极大的影响4、RMAN支持不需要停机、进行块级的还原与恢复5、块级恢复只适合数据文件,其余文件通过复用来解决RMAN讹误块的检测1、RMAN在执行备份的时候会检测讹误的数据块(硬件、软件讹误都检测)2、用户托管的备份是操作系统的copy命令对数据文件进行拷贝,只有遇到硬件讹误的时候,影响了copy的操作,才会检测到错误,否则会将讹误的数据块在毫不知情的情况下进行了备份,这对Oracle来说没有什么意义。COPY是按照操作系统数据块进行备份的。3、RMAN在进行备份的时候会进行验证(读取数据块、验证数据块),如果碰到讹误,立即终止备份过程。4、我们可以设置讹误块容限(rman容错机制),这样RMAN在讹误块没有超出容限以前继续进行备份。5、出现讹误块以后,RMAN会将讹误块的地址存储在存储仓库中V$DATABASE_BLOCK_CORRUPTION:导致问题的地址(文件号、块号)V$BACKUP_CORRUPTION对于备份集来说,讹误数据块在备份集中的位置V$COPY_CORRUPTION对于备份映像来说,讹误数据块在备份映像中的位置常规中1、不设置容限2、RMAN备份出现问题以后会退出3、设置容限,重新备份,备份完成以后,查看出问题的数据块默认情况下,RMAN始终会检查非RMAN环境中被称为“介质讹误”的物理讹误。(Oracle不能处理的讹误块:具有无效校验和的数据块、或填充全零的数据块)我们可以指示RMAN检查逻辑讹误。1、不检查讹误(nochecksum参数)2、检查逻辑讹误(软件讹误)块介质恢复1、RMAN检测到块讹误,会进行块介质恢复(blockmediarecovery)BMRBMR的优点受损文件不需要脱机正常的DML可以继续执行恢复操作的时间大大的减少(相对文件恢复)只有一个会话遇到受损数据块的时候,才会出现会话的停机会话停机的报错是ORA-015782、BMR的流程一系列需要恢复的数据块RMAN从备份集或者备份映像中抽取出这些数据块的备份、并将其写入相应的数据文件中RMAN扫描归档日志,抽取出并应用与被还原数据块相关的重做记录恢复始终是完全恢复、而且只能是完全恢复3、BMR可以应用于任何类型的数据块,包括LOB和UNDO段都可以BLOCKRECOVER命令如果受损的情况比较严重1、设置了RMAN的MAXCORRUPT选项,对数据文件进行了备份,RMAN会将所有的讹误块存储在视图V$DATABASE_BLOCK_CORRUPTION中2、我们在RMAN中使用了CORRUPTIONLIST选项,这个选项指示RMAN将视图中列出的所有的讹误数据块进行还原、恢复3、为了确保用于还原的备份在讹误出现以前生成,可以选择UNTILTIME选项使用7天前的备份进行还原。块级恢复全部都是完全恢复。处理讹误1、标识确实发生的讹误(以下3种方式可发现)考虑用DBVERIFY实用程序监测讹误,再用RMAN恢复讹误等待用户报告ORA-01578错误针对数据文件、备份映像进行的DBVERIFY实用程序RMAN检测讹误(默认RMAN遇到讹误会退出)2、标识讹误数据块所属的对象根据备份策略进行完全恢复例外:讹误出现在所有的备份中(RMAN一般不会出现上面的问题)建议使用RMAN进行备份恢复如果标识的对象是一个索引,那么重建这个索引是最好的如果索引是用于实施唯一或者主键约束、那么这个约束必须被禁用。而且在重新启用该约束以前,必须为DML锁定相应的表。3、如果是表受损,可以使用DBMS_REPAIR进行标记讹误块、skip讹误块,最终使用对象,但是会丢失数据,根据具体的业务情况来使用。4、如果是RMAN,那么使用BMR就是最好的选择,联机完全恢复还原数据块。5、最重要的是要标识出现问题的原因服务器IO系统磁盘内存Oraclebug(通过metalink站点记录了这些bug)