【Oracle篇】Oracle数据库坏块处理:rman修复坏块实践与案例分析(第七篇,总共八篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨

💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️

💖💖💖大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注💖💖💖

    今天这篇文章作为Oracle rman系列的倒数第二篇,那么如标题所示给大家介绍一下怎么通过rman备份修复坏块的问题,那么大家都知道 rman是物理备份工具,可以通过备份的文件对存在的坏块进行修复。那么废话我就不再多说,带着修复坏块的问题,进入今天的内容吧!!!

    然而,RMAN所涉及的内容之广、之深,使得难以在单篇文章中全面涵盖。所以我将理论、命令、备份策略、异机恢复、坏块处理等分成八篇文章去讲,即使分为八篇也有不少内容没有涵盖到,但是这八篇文章都是精华,看完这八篇就可以解决95%以上的RMAN相关工作内容了。八篇文章的内容分别如下:

  • 第一篇:rman物理备份工具的基础理论概述
  • 第二篇:rman工具实用指南:常用命令详解与实践
  • 第三篇:rman标准化全库备份策略:完整备份or增量备份
  • 第四篇:rman全库异机恢复:从RAC环境到单机测试环境的转移
  • 第五篇:rman全库异机恢复:从单机环境到RAC测试环境的转移
  • 第六篇:rman时间点异机恢复:从RAC环境到单机测试环境的转移
  • 第七篇:Oracle数据库坏块处理:rman修复坏块实践与案例分析(当前篇)
  • 第八篇:逻辑备份工具expdp(exp)/impdp(imp)和物理备份工具rman的区别和各自的使用场景总汇

           

坏块分为两种:

  • 物理坏块:指的是由于介质损坏或存储层面的问题导致的块损坏,例如磁盘故障或数据损坏。BLOCKRECOVER命令可以用来修复这种类型的损坏,它会尝试从备份中恢复受损的数据块,或者使用磁盘上的镜像数据进行修复。
  • 逻辑坏块:则是由数据库逻辑结构的问题引起的块损坏,例如数据完整性约束问题或逻辑错误导致的块损坏。对于逻辑坏块,通常需要通过其他手段来修复,比如恢复到一个之前的时间点或者执行逻辑数据修复操作。逻辑坏块可以分为如下:data block(数据块)、index block(索引块)、segment header/bitmap block ...etc(段头)

                          

检验坏块的工具:

ps小提示:这篇文章主要会用到dbverify、rman进行检验坏块,因为篇幅有限对于exp/expdp、analyze、dbms_repair这篇文章不做介绍哦。关于exp/expdp、analyze、dbms_repair方式博主也是会的,exp/expdp可以参考之前博主写的博客,对于analyze、dbms_repair有需要的小伙伴可以私聊我😗

工具

描述

备注

dbverify

用于验证数据文件dbf、表、索引等,能够校验open阶段的数据文件以及shutdown状态下的数据文件,检查块的一致性错误。

主要是检验是否存在坏块,并不能修复

exp/expdp

exp:对于包含坏块的表执行导出操作,会收到相关的错误信息。

expdp:不会给出坏块的提示,只会将对象正确的数据导出。

主要是检验是否存在坏块,并不能修复

analyze

analyze命令的主要目的是通过分析数据库对象,为优化器收集数据库对象的统计量信息,以便优化器生成准确的执行计划。同时,它也能检查某个表或索引是否存在损坏的情况。

主要是检验是否存在坏块,并不能修复

dbms_repair

DBMS_REPAIR 是Oracle自带的包,使用 DBMS_REPAIR 包来修复,并非完全恢复,而是标记坏块,然后不对其进行访问,这部分被标记的数据也就丢失了,这是无法避免的。

可以检验和修复坏块

rman

RMAN是一块备份工具,就像一个过滤器,RMAN需要通过缓存过滤每一个块,其中一个特点就是检查块是否被损坏。如果备份的数据库中包含有坏块,将会收到错误。同检测物理坏块一样rman备份也具备检测逻辑坏块的功能。

可以检验和修复坏块

              

检验坏块的视图:

SQL> select * from v$database_block_corruption;      ###V$DATABASE_BLOCK_CORRUPTION显示有关上次备份后损坏的数据库块的信息。
FILE#:包含损坏块的数据文件的绝对文件号(坏块所在的文件)
BLOCK#:损坏块范围内第一个损坏块的块号(坏块的坏块号)
BLOCKS:从开始找到的损坏块数BLOCK#
CORRUPTION_CHANGE#:检测到逻辑损坏的更改号。设置为0表示介质损坏。
CORRUPTION_TYPE:数据文件中的块损坏类型:
                   ALL ZERO:磁盘上的块头只包含零。如果该块从未被填充并且位于Oracle7文件中,则它可能是有效的。对于空块,缓冲区将被重新格式化为Oracle8标准。
                   FRACTURED:块头看起来很合理,但是块的前后是不同的版本。
                   CHECKSUM:可选检查值显示该块不是自洽的。无法确定校验值失败的确切原因,但它可能会失败,因为块中间的扇区来自不同的版本。
                   CORRUPT:块被错误识别或不是数据块(例如,数据块地址丢失)
                   LOGICAL:块逻辑损坏

                  

修复坏块的方法:

ps小提示:这篇文章主要使用rman进行恢复所以只会讲解rman,因为篇幅有限其他两种方式这篇文章不做介绍。关于其他两种方式博主也是会的,有需要的小伙伴可以私聊我💓

工具

描述

修复场景

dbms_repair

DBMS_REPAIR 是Oracle自带的包,使用 DBMS_REPAIR 包来修复,并非完全恢复,而是标记坏块,然后不对其进行访问,这部分被标记的数据也就丢失了,这是无法避免的。

如果没有备份,那么通过dbms_repair标记坏块

rman

通过rman中的blockrecover命令进行坏块的修复。

在有rman备份的情况通过备份进行修复

bbed

BBED(Oracle Block Browerand EDitor Tool),用来直接查看和修改数据文件数据的一个工具,是Oracle一款内部工具,可以直接修改Oracle数据文件块的内容,在一些极端恢复场景下比较有用。该工具不受Oracle支持,所以默认是没有生成可执行文件的,在使用前需要安装。并且使用BBED可能导致数据进一步损坏或数据库不一致,因此在操作之前,必须理解风险

如果没有备份,那么通过bbed工具修复数据库块。使用bbed工具对技术要求非常高。

            

相关参数:

一、db_block_checksum

默认值TYPICAL

参数含义:DB_BLOCK_CHECKSUM确定是否DBWn直接加载程序将计算校验和(从存储在数据块中的所有字节计算出的数字),并在将数据块写入磁盘时将其存储在每个数据块的缓存头中。

    如果此参数为,则块为只读时校验与TYPICAL或者FULL并且该块的最后一次写入存储了校验和。在…里FULL模式下,Oracle还会在应用update/delete语句的更改之前验证校验和,并在应用更改后重新计算校验和。此外,Oracle会在将每个日志块写入当前日志之前为其提供一个校验和。

    大多数日志块校验和由生成前台进程完成,而LGWR或LGWR从进程(LG神经网络进程)执行其余的工作,以获得更好的CPU和缓存效率。

    如果此参数设置为OFF, DBWn仅为计算校验和SYSTEM表空间,但不适用于用户表空间。此外,当此参数设置为时,不执行日志校验和OFF.

    校验和允许Oracle检测由底层磁盘、存储系统或I/O系统导致的损坏。如果设置为FULL, DB_BLOCK_CHECKSUM还捕获内存中的损坏,并阻止它们进入磁盘。在中打开此功能TYPICAL模式只会导致1%到2%的额外开销。在……里FULL模式会导致4%到5%的开销。Oracle建议您设置DB_BLOCK_CHECKSUM到TYPICAL.

                         

二、db_block_checking

默认值:FALSE

参数含义:DB_BLOCK_CHECKING指定Oracle数据库是否对数据库块执行块检查。Oracle通过遍历块中的数据来检查块,确保它在逻辑上是一致的。块检查通常可以防止内存和数据损坏。在大多数应用程序中,数据块检查通常会导致1%到10%的开销,具体取决于工作负载和参数值。特定的DML开销可能会更高。工作负载中的更新或插入越多,启用块检查的代价就越大。你应该设置DB_BLOCK_CHECKING到FULL如果性能开销是可接受的。参数有如下几个值:

          一、OFF or FALSE:不对用户表空间中的块执行块检查。但是,语义块检查SYSTEM表空间块总是打开的。

          二、LOW:在内存中的块内容改变后(例如UPDATE, INSERT或者DELETE语句,或者在Oracle RAC中的实例间块传输之后)。

          三、MEDIUM:全部LOW对除索引之外的所有对象执行检查和完整的语义检查(遇到损坏时,可以通过drop+rebuild来重建索引的内容)。

          四、FULL or TRUE:全部LOW和MEDIUM对所有对象执行检查和完整的语义检查。

                

    因为下面案例中会用到dbverify、rman工具,所以先介绍一下dbverify工具和rman修复块的命令。

一、dbverify验证工具:

    运行于操作系统提示符下的外部程序,用于验证数据文件dbf、表、索引等,能够校验open阶段的数据文件以及shutdown状态下的数据文件,检查块的一致性错误。

                  

优缺点:

  • 缺点:不支持验证联机日志、控制、归档文件,以及rman备份集验证
  • 优点:被验证的文件可以位于文件系统、asm磁盘或原始设备。向下兼容(自动识别低版本数据库,低版本的 dbv 访问高版本会报错)

          

路径:

  • 在linux/unix位于:$ORACLE_HOME/bin/dbv
  • 在windows位于:%ORACLE_HOME%/bin/dbv.exe

               

使用方法:

[oracle@11g ~]$ dbv

参数选项

描述

FILE

要验证的文件

START

开始的块

END

结束的块

BLOCKSIZE

逻辑块大小

LOGFILE

输出日志

FEEDBACK

显示进度

PARFILE

参数文件

USERID

用户名/密码

SEGMENT_ID

段ID(tsn.relfile.block)

HIGH_SCN

要验证的最高块SCN(SCN_wrap.SCN_base OR SCN)

eg示例:
[oracle@lf2 ~]$ dbv  file=datafile路径  feedback=number userid=name/password  segment=tablespace id . datafile id . segment head id 
feedback=number:表示检查每number个数据块就打上一个点。例feedback=100,每检查100个数据块打上一个点
Segment_id:通过表空间的 id,段所在数据文件的 id,段的头部 id,验证数据文件中一个表或一个索引的可用性。配合userid使用

                

二、RMAN备份修复坏块:

    在Oracle的RMAN(Recovery Manager)中,BLOCKRECOVER命令用于恢复单个或多个数据块,而不需要恢复整个数据文件或数据库。这在某些情况下非常有用,特别是当只有少量数据块受到损坏时。那么出现数据块错误时,都会有错误消息:ORA-01578: ORACLE data block corrupted (file #18,block #88) 。

    如果没有BMR时,我们必须从一个备份中恢复这个数据文件,在恢复过程中,用户不能使用该数据块文件中的所有数据。用BMR恢复就很简单,只需要执行blockrecover命令即可。

    如果在备份时提示ORA-19566: exceeded limit of 0 corrupt blocks for file +DATA01/orcl/datafile/system.256.1038007655那么表示有坏块,需要修复

    关于命令的详细介绍参考之前的文章,直通车👉【Oracle篇】rman工具实用指南:常用命令详解与实践(第二篇,总共八篇)-CSDN博客👈

                

RMAN>blockrecover datafile 1 block 45574,45575;      ###从备份中恢复多个数据文件坏掉的块

                    

那么开始今天的案例吧!!!

案例开始

一、模拟表数据

[oracle@11g full]$ sqlplus test/123456
SQL>
create table tb1 (id number(10),name varchar2(10));
insert into tb1 values (1,'name01');
insert into tb1 values (2,'name02');
insert into tb1 values (3,'name03');
insert into tb1 values (4,'name04');
insert into tb1 values (5,'name05');
commit;

二、对库进行全备(坏块从rman备份中恢复)

这里我就不写全备的脚本了,小伙伴可以跳转到👉【Oracle篇】rman标准化全库备份策略:完整备份or增量备份(第三篇,总共八篇)_rman增量备份-CSDN博客👈进行参考哦

三、查看对象的块信息

我们都知道在Oracle数据库中块是Oracle管理存储空间的基本单位,默认每个块的大小为8K。那么在逻辑上存储为块—区—段—表空间。

    表空间(Table Space):在Windows操作系统中,使用文件夹来分类管理各种文件,表空间相当于Oracle数据库的文件夹。每个表空间由一个或多个数据文件组成,一个数据文件只能与一个表空间相联系,主要存放的对象是表, 所以称作表空间。

    数据段(Data Segment):段是指占用数据文件空间的通称,或数据库对象使用的空间的集合;段可以有表段、索引段、回滚段、临时段和高速缓存段等。

    数据区间(Data Extent):是数据库存储空间分配的一个逻辑单位,它由连续数据块所组成。第一个段是由一个或多个区组成。当一段中间所有空间已完全使用,oracle 为该段分配一个新的范围。

    数据块(Data Block):是oralce管理数据文件中存储空间的单位,为数据库使用的 I/O 的最小单位,其大小可不同于操作系统的标准 I/O块大小。常见大小为8KB或16KB

[oracle@11g full]$ sqlplus / as sysdba
SQL> select * from dba_segments where owner='TEST' and segment_name='TB1';     ###通过dba_segments视图查看表对象开始的头块ID

SQL> select * from dba_extents where owner='TEST' and segment_name='TB1';      ###dba_extents查看每个区开始的块

四、破坏user表空间的8404、8405块

[oracle@11g orcl]$
dd of=/oracle/app/oracle/oradata/orcl/users.264.1140874093 bs=9182 conv=notrunc seek=8404 <<EOF
New corrupted block!
EOF
###将users表空间的8404块输入New corrupted block!内容

[oracle@11g orcl]$
dd of=/oracle/app/oracle/oradata/orcl/users.264.1140874093 bs=9182 conv=notrunc seek=8405 <<EOF
New corrupted block!
EOF
###将users表空间的8405块输入New corrupted block!内容

五、验证是否存在坏块

方式一:通过rman的验证备份

RMAN> backup validate database;  
###扫描数据库的物理/逻辑错误,并不执行实际备份,如果有坏块会报出来。验证每个数据文件,status为FAILED,Blocks Failing(坏块)有内容需要先dbv验证坏块编号,然后rman修复坏块。
File   Status   Marked Corrupt   Empty Blocks   Blocks Examined   High SCN
-----  ----------  -----------------------   ------------------   -----------------------   ------------
5     FAILED          0         124840          131072        8866322   
File Name: /oracle/app/oracle/oradata/orcl/users.264.1140874093
Block Type   Blocks Failing   Blocks Processed
--------------   -------------------  ------------------------
  Data           0            5552            
  Index          0             391             
  Other          2             289 

              

方式二:通过视图

SQL> select * from v$database_block_corruption;    ###V$DATABASE_BLOCK_CORRUPTION显示有关上次备份后损坏的数据库块的信息。

                     

方式三:通过dbv验证数据文件是否有坏块

[oracle@11g ~]$ dbv  file=/oracle/app/oracle/oradata/orcl/users.264.1140874093

解析一:文件5的8404、8405是坏块

解析二:Total Pages Marked Corrupt  : 2        已标记为损坏的页面总数。文件中有2个坏块

六、通过rman备份片恢复坏块。关于blockrecover命令可以参考之前的文章哦👉【Oracle篇】rman工具实用指南:常用命令详解与实践(第二篇,总共八篇)-CSDN博客👈

[oracle@11g ~]$ rman target /
RMAN> blockrecover datafile 5 block 8404;  
RMAN> blockrecover datafile 5 block 8405;    ###从备份中恢复这个数据文件坏掉的块,支持多个坏块同时修复(blockrecover datafile 4 block 23657,23658)

七、验证是否还存在坏块

方式一:通过rman的验证备份

RMAN> backup validate database;      ###所有的文件status为OK,Blocks Failing为0

               

方式二:通过视图

SQL> select * from v$database_block_corruption;    ###V$DATABASE_BLOCK_CORRUPTION显示有关上次备份后损坏的数据库块的信息。没有输出就表示不存在坏块

        

方式三:通过dbv验证数据文件是否有坏块

[oracle@11g ~]$ dbv  file=/oracle/app/oracle/oradata/orcl/users.264.1140874093
解析:
Total Pages Examined         : 131072        总共处理了131072个块(页),一个数据块大小(show parameter block),此数据文件大小为1G
Total Pages Processed (Data) : 5552          数据文件中已用数据的块数(页数),此数据文件只用了43M
Total Pages Failing   (Data) : 0             文件中有问题的块数(页数),此数据文件正常
Total Pages Processed (Index): 391           文件中索引占用的块数(页数),索引用3M
Total Pages Failing   (Index): 0             文件中有问题索引的块数(页数),索引正常
Total Pages Processed (Other): 289           文件中其他对象占用的块数(页数),其他对象占用了2M
Total Pages Processed (Seg)  : 0             文件中数据段占用的块数(页数)
Total Pages Failing   (Seg)  : 0             文件中有问题数据段的块数(页数)
Total Pages Empty            : 124840        数据文件没有用的数据块(页数)
Total Pages Marked Corrupt   : 0             文件坏块的块数(页数)
Total Pages Influx           : 0             如果值大于零,且未存在坏块的情况下,是由于处于open的文件,运行dbv程序遇到了一个当前正在被dbwn进程写入的数据块
Total Pages Encrypted        : 0             文件加密占用的块数(页数)
Highest block SCN            : 8866322 (0.8866322)        数据文件scn号

    呼,今天的内容不算多,但是整理起来还是很麻烦的,所以希望小伙伴们不吝自己的小手 点赞、收藏、加关注 。不过我也希望大家永远不要用到这篇文章,因为生产环境出现坏块是个非常严重的问题,而且有时候rman也发现不了坏块,所以这篇文章以备不时之需,有些技术可能在自己的职业生涯用不上,但是一定是必须要会的,万一那天出现了关于这个问题,自己可以快速借助文档去处理掉🙌

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奈斯DB

打赏到账,我飘啦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值