当前位置: 首页 > news >正文

【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命令可以用来修复这种类型的损坏,它会尝试从备份中恢复受损的数据块,或者使用磁盘上的镜像数据进行修复。
  • 逻辑坏块:则是由数据库逻辑结构的问题引起的块损坏,例如数据完整性约束问题或逻辑错误导致的块损坏。对于逻辑坏块,通常需要通过其他手段来修复,比如恢复到一个之前的时间点或者执行逻辑数据修复操作。

            

验证是否有坏块的办法:

工具列表

坏块检查类型

能否修复坏块

描述

dbverify

物理

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

exp/expdp

物理

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

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

analyze

逻辑

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

dbms_repair

逻辑

rman

物理and逻辑

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:块逻辑损坏

          

相关参数:

db_block_checksumDB_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_checkingDB_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对所有对象执行检查和完整的语义检查。

                      

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

案例开始

一、模拟表数据

[oracle@11g full]$ sqlplus test/123456
SQL>
create table tb1 (id number(10),name varchar2(10));
insert into tb1 values (1,'itpux01');
insert into tb1 values (2,'itpux02');
insert into tb1 values (3,'itpux03');
insert into tb1 values (4,'itpux04');
insert into tb1 values (5,'itpux05');
commit;

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

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

三、查看对象的块信息

[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、8495是坏块

解析二: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也发现不了坏块,所以这篇文章以备不时之需,有些技术可能在自己的职业生涯用不上,但是一定是必须要会的,万一那天出现了关于这个问题,自己可以快速借助文档去处理掉🙌

相关文章:

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

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…...

学懂C#编程:从一个简单的例子理解事件处理

在C#中&#xff0c;事件是一种特殊的委托类型&#xff0c;用于在对象上发生某些事情时通知订阅者。事件的处理通常包括定义事件&#xff0c;创建触发事件的条件&#xff0c;以及订阅该事件的事件处理程序。 以下是一个简单的C#事件处理示例&#xff1a; using System;// 定义…...

深入理解指针(2)

4. const 修饰指针 4.1 const修饰变量 变量是可以修改的&#xff0c;如果把变量的地址交给⼀个指针变量&#xff0c;通过指针变量的也可以修改这个变量。 但是如果我们希望⼀个变量加上⼀些限制&#xff0c;不能被修改&#xff0c;怎么做呢&#xff1f;这就是const的作⽤。 …...

C#.Net筑基-集合知识全解

01、集合基础知识 .Net 中提供了一系列的管理对象集合的类型&#xff0c;数组、可变列表、字典等。从类型安全上集合分为两类&#xff0c;泛型集合 和 非泛型集合&#xff0c;传统的非泛型集合存储为Object&#xff0c;需要类型转。而泛型集合提供了更好的性能、编译时类型安全…...

AI PPT生成器,一键在线智能生成PPT工具

PPT作为商业沟通和教育培训中的重要工具&#xff0c;PPT制作对于我们来说并不陌生。但是传统的PPT制作不仅耗时&#xff0c;而且想要做出精美的PPT&#xff0c;需要具备一定的设计技能。下面小编就来和大家分享几款AI PPT工具&#xff0c;只要输入主题&#xff0c;内容就可以在…...

stm32学习笔记---零基础入门介绍2

目录 STM32介绍 STM32家族系列 ARM介绍 ARM内核型号种类 我们学习用的STM32 片上资源/外设&#xff08;Peripheral&#xff09; 命名规则 系统结构 引脚定义 STM32的启动配置 STM32最小系统电路和其他部分电路 最小系统板的实物图 附&#xff1a;安装软件准备 声明…...

搭建取图系统app源码开发,满足广泛应用需求

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 图片已成为信息传递的重要媒介&#xff0c;广泛应用于各个领域。为满足日益增长的图片需求&#xff0c;搭建一款高效的取图系统&#xff0c;可以为用户提供便捷、全面的…...

语音质量评价方法之MOS

引言 在语音增强、语音合成、语音转换、声音转换、语音克隆、语音修复等等领域&#xff0c;常常要对输出的语音进行评价。对语音的质量评价一般关注两个方面&#xff0c;即主观评价和客观评价。主观评价就是人凭借听觉感受对语音进行打分&#xff0c;客观评价比较广泛&#xf…...

gorm简介

【1】ORM: 即Object-Relational Mapping,它的作用是在关系型数据库和对象之间作一个映射&#xff0c;这样我们在具体的操作数据库的时候&#xff0c;就不需要再去和复杂的SQL语句打交道&#xff0c;只要像平时操作对象一样操作它们就可以了。 【2】GORM gorm是go语言的一个orm…...

MySQL:SELECT list is not in GROUP BY clause 报错 解决方案

一、前言 一大早上测试环境&#xff0c;发现测试环境的MySQL报错了。 SELECT list is not in GROUP BY clause and contains nonaggregated column二、解决方案 官方文档中提到&#xff1a; 大致意思&#xff1a; 用于GROUP BY的SQL / 92标准要求满足以下条件&#xff1a; SE…...

IPython的使用技巧

1、解释说明 IPython是一个强大的Python交互式shell&#xff0c;它提供了丰富的功能&#xff0c;如自动补全、历史记录、内置帮助等。IPython使得在命令行下编写和测试Python代码变得更加方便和高效。 2、使用示例 安装IPython&#xff1a; pip install ipython启动IPython…...

Spring Boot 多线程例子

在Spring Boot中&#xff0c;多线程可以通过Java的并发工具来实现。以下是一些常见的多线程实现方法&#xff1a; 1. 使用Async注解和CompletableFuture&#xff1a; 首先&#xff0c;需要在Spring Boot应用的主类上添加EnableAsync注解&#xff0c;以启用异步支持。 java Spr…...

java干货 线程池的分析和使用

文章目录 一、了解线程池1.1 什么是线程池1.2 为什么需要线程池 二、四种线程池的使用2.1 newFixedThreadPool2.2 newCachedThreadPool2.3 newSingleThreadExecutor2.4 newScheduledThreadPool 三、自定义线程池3.1 线程池七大核心参数3.2 线程池内部处理逻辑 一、了解线程池 …...

文本张量入门

张量&#xff0c;英文为Tensor&#xff0c;是机器学习的基本构建模块&#xff0c;是以数字方式表示数据的形式。 张量的基本类型: 创建一个标量&#xff08;0维张量&#xff09;&#xff0c;也就是一个单独的数字 scalar torch.tensor(7) scalar.ndim # 返回张量的维度 0 # …...

js文字如何轮播?

<div class"td-style"> <span class"td-text">内容1内容1内容1内容1内容1内容1</span> </div> css&#xff1a; <style> .td-style { width: 160px; height: 72px; overflow: hidden; white-…...

Linux 五种IO模型

注&#xff1a;还有一种信号驱动IO&#xff0c;使用较少暂不讨论&#xff1b; 一&#xff0c;区分阻塞、非阻塞和同步、异步 看了很多文章对这两组概念解释和对比&#xff0c;说的太复杂了&#xff0c;其实没必要&#xff0c;两句话就能说清楚。 首先&#xff0c;对于读数据rec…...

深度解析响应式异步编程模型

上一篇文章中我们聊了一下线程池,基于线程池的多线程编程是我们在高并发场景下提升系统处理效率的有效手段,但却不是唯一的。今天我们来看一下另一种异步开发的常用手段-响应式编程模型 传统多线程模型的缺陷 多线程模型是目前应用最为广泛的并发编程手段,但凡遇到什么性能…...

一个软件是如何开发出来的呢?

一、前言 如今&#xff0c;AI大爆发的时代&#xff0c;作为一名IT从业者&#xff0c;你是否也想尝试开发一套自己的系统&#xff0c;实现那些看似有可能实现的天马行空的想法&#xff0c;变成一个优秀甚至伟大的产品&#xff0c;甚至带来某个行业的革新&#xff0c;那作为一名…...

宝塔板面有哪些优势

哈喽呀&#xff0c;大家好呀&#xff0c;淼淼又来和大家见面啦&#xff0c;在当今数字化时代&#xff0c;随着云计算和互联网技术的飞速发展&#xff0c;服务器管理成为了许多企业和个人开发者不可或缺的一部分。然而&#xff0c;传统服务器管理方式的复杂性和技术门槛往往令初…...

Mybatis中BaseEntity作用

新建各种对象的时候&#xff0c;一般来说&#xff0c;有几个属性是所有对象共有的&#xff0c;比如说id,is_del&#xff0c;is_enable这些&#xff0c;然后设置一个基础对象&#xff0c;以后新建所有对象的时候都继承它&#xff0c;就省的每次都要写这些共有的属性了...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...