Oracle 11gR2 坏块修复实例一则

news2024/11/26 8:07:18

背景

前段时间在 Oracle 11gR2 数据库中发现了坏块问题。环境是 64 位 Linux 平台。本文将详细介绍如何使用 DBMS_REPAIR 进行在线修复,当然也可以基于备份和 RMAN 的修复方法这里暂时不做介绍。

发现坏块

1. 从 alert.log 中发现错误

alert.log 文件中发现了如下错误信息:

DDE: Problem Key 'ORA 1110' was flood controlled (0x1) (no incident)
ORA-01110: data file 8: '/u01/app/oracle/TESTDB/oradata/data/TESTDB_test_data_03.dbf'
Byte offset to file# 8 block# 570051 is 374890496
Incident 1567129 created, dump file:

2. 从 trace 文件中获取详细信息

trace 文件中找到了更详细的错误描述:

/u01/app/oracle/testdb/admin/TESTDB/diag/rdbms/TESTDB/TESTDB/incident/incdir_1567129/TESTDB_ora_5396_i1567129.trc
ORA-01578: ORACLE data block corrupted (file # 8, block # 570051)
ORA-01110: data file 8: '/u01/app/oracle/TESTDB/oradata/data/TESTDB_test_data_03.dbf'

Dump continued from file: /u01/app/oracle/testdb/admin/TESTDB/diag/rdbms/TESTDB/TESTDB/trace/TESTDB_ora_5396.trc
ORA-01578: ORACLE data block corrupted (file # 8, block # 570051)
ORA-01110: data file 8: '/u01/app/oracle/TESTDB/oradata/data/TESTDB_test_data_03.dbf'

Dump for incident 1567129 (ORA 1578)

3. 查询坏块的段类型

尝试查询坏块的段类型,确认是索引还是表段出问题了。查询结果为空:

SQL> select segment_name, tablespace_name, segment_type, block_id, file_id, bytes
     from dba_extents
     where block_id = 570051 and file_id = 8;

no rows selected

4. 运行日志中的 SQL 语句

运行日志中的 SQL 语句,报错如下:

SELECT xxxxx FROM APP_CONTROL AC, APP_BILL_PROC BL
WHERE APP.DATA_GROUP IS NOT NULL
AND BL.PROCESS_ID = APP.NXT_PGM_NAME
AND APP.FILE_STATUS IN ('RD', 'IU', 'CN')
GROUP BY xxxxxxx

ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 8, block # 570051)
ORA-01110: data file 8: '/u01/app/oracle/TESTDB/oradata/data/TESTDB_TEST_DATA_03.dbf'

5. 验证相关表

查询相关表的记录数,没有问题:

SQL> select count(*) from APP_CONTROL;
COUNT(*)
----------
1613

SQL> select count(*) from APP_BILL_PROC;
COUNT(*)
----------
103

6. 再次验证 SQL 语句

再次运行日志中的 SQL 语句,依然报错:

SELECT xxxxx FROM APP_CONTROL AC, APP_BILL_PROC BL
WHERE APP.DATA_GROUP IS NOT NULL
AND BL.PROCESS_ID = APP.NXT_PGM_NAME
AND APP.FILE_STATUS IN ('RD', 'IU', 'CN')
GROUP BY xxxxxxx

ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 8, block # 570051)
ORA-01110: data file 8: '/u01/app/oracle/TESTDB/oradata/data/TESTDB_test_data_03.dbf'

使用 DBMS_REPAIR 进行在线修复

1. 创建修复表

通过 DBMS_REPAIR.ADMIN_TABLES 创建修复表 REPAIR_TABLE

SQL> BEGIN
  2  DBMS_REPAIR.ADMIN_TABLES (
  3  TABLE_NAME => 'REPAIR_TABLE',
  4  TABLE_TYPE => dbms_repair.repair_table,
  5  ACTION => dbms_repair.create_action,
  6  TABLESPACE => 'test_DATA');
  7  END;
  8  /

PL/SQL procedure successfully completed.

2. 描述修复表

描述生成的修复表 REPAIR_TABLE

SQL> desc repair_table
Name                            Null?    Type
----------------------------------------- -------- ----------------------------
OBJECT_ID                       NOT NULL NUMBER
TABLESPACE_ID                   NOT NULL NUMBER
RELATIVE_FILE_ID                NOT NULL NUMBER
BLOCK_ID                        NOT NULL NUMBER
CORRUPT_TYPE                    NOT NULL NUMBER
SCHEMA_NAME                     NOT NULL VARCHAR2(30)
OBJECT_NAME                     NOT NULL VARCHAR2(30)
BASEOBJECT_NAME                          VARCHAR2(30)
PARTITION_NAME                          VARCHAR2(30)
CORRUPT_DESCRIPTION                      VARCHAR2(2000)
REPAIR_DESCRIPTION                       VARCHAR2(200)
MARKED_CORRUPT                   NOT NULL VARCHAR2(10)
CHECK_TIMESTAMP                  NOT NULL DATE
FIX_TIMESTAMP                             DATE
REFORMAT_TIMESTAMP                        DATE

3. 检查坏块

使用 DBMS_REPAIR.CHECK_OBJECT 检查坏块:

SQL> set serveroutput on
SQL> DECLARE
  2  num_corrupt INT;
  3  BEGIN
  4  num_corrupt := 0;
  5  DBMS_REPAIR.CHECK_OBJECT (
  6  SCHEMA_NAME => 'TSTAPP',
  7  OBJECT_NAME => 'APP_CONTROL',
  8  REPAIR_TABLE_NAME => 'REPAIR_TABLE',
  9  corrupt_count => num_corrupt);
 10  DBMS_OUTPUT.PUT_LINE('number corrupt: ' || TO_CHAR (num_corrupt));
 11  END;
 12  /

number corrupt: 1
PL/SQL procedure successfully completed.

4. 查询坏块记录

查询生成的坏块表,确认坏块位置:

SQL> select BLOCK_ID, CORRUPT_TYPE, CORRUPT_DESCRIPTION
  2  from REPAIR_TABLE;

BLOCK_ID CORRUPT_TYPE
---------- ------------
CORRUPT_DESCRIPTION
--------------------------------------------------------------------------------
570051           6148

5. 修复坏块

使用 DBMS_REPAIR.FIX_CORRUPT_BLOCKS 修复坏块:

SQL> DECLARE
  2  num_fix INT;
  3  BEGIN
  4  num_fix := 0;
  5  DBMS_REPAIR.FIX_CORRUPT_BLOCKS (
  6  SCHEMA_NAME => 'TSTAPP',
  7  OBJECT_NAME => 'APP_CONTROL',
  8  OBJECT_TYPE => dbms_repair.table_object,
  9  REPAIR_TABLE_NAME => 'REPAIR_TABLE',
 10  FIX_COUNT => num_fix);
 11  DBMS_OUTPUT.PUT_LINE('num fix: ' || to_char(num_fix));
 12  END;
 13  /

num fix: 0
PL/SQL procedure successfully completed.

6. 跳过坏块

使用 DBMS_REPAIR.SKIP_CORRUPT_BLOCKS 跳过坏块:

SQL> BEGIN
  2  DBMS_REPAIR.SKIP_CORRUPT_BLOCKS (
  3  SCHEMA_NAME => 'TSTAPP',
  4  OBJECT_NAME => 'APP_CONTROL',
  5  OBJECT_TYPE => dbms_repair.table_object,
  6  FLAGS => dbms_repair.SKIP_FLAG);
  7  END;
  8  /

PL/SQL procedure successfully completed.

7. 再次运行 SQL 语句

再次运行之前的 SQL 语句,验证修复效果:

SQL> SELECT xxxxx FROM APP_CONTROL AC, APP_BILL_PROC BL
  2  WHERE APP.DATA_GROUP IS NOT NULL
  3  AND BL.PROCESS_ID = APP.NXT_PGM_NAME
  4  AND APP.FILE_STATUS IN ('RD', 'IU', 'CN')
  5  GROUP BY xxxxxxx;

-- 成功执行,不再报错

结论

通过使用 DBMS_REPAIR,我们成功地在线修复了 Oracle 11gR2 数据库中的坏块问题。这种方法适用于需要快速恢复业务的情况。此外,还可以通过备份和 RMAN 进行更彻底的修复,具体方法取决于数据库的归档模式(ARCHIVELOG 或 NOARCHIVELOG)后面有机会再总结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2247731.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】——卷积与循环的交响曲:神经网络模型在现代科技中的协奏

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…

php 导出excel 一个单元格 多张图片

public function dumpData(){error_reporting(0); // 禁止错误信息输出ini_set(display_errors, 0); // 不显示错误$limit $this->request->post(limit, 20, intval);$offset $this->request->post(offset, 0, intval);$page floor($offset / $limit) 1 ;$wh…

几天游记啊

绿灯常亮,黄灯闪,就是没有上线状态 一 2024.11.24 青浦圆通信息中心:vsphere client IDC运维专员可能就这项技能稀缺 二 2024.11.25 1 字节服务器外包单位有孚网路 什么互联网交换中心 不了解的人还以为是国家火炬计划呢!实际…

【C++动态规划 子集状态压缩】2002. 两个回文子序列长度的最大乘积|1869

本文涉及知识点 C动态规划 位运算、状态压缩、枚举子集汇总 LeetCode2002. 两个回文子序列长度的最大乘积 给你一个字符串 s ,请你找到 s 中两个 不相交回文子序列 ,使得它们长度的 乘积最大 。两个子序列在原字符串中如果没有任何相同下标的字符&…

记录:从.Net程序的内存转储文件中提取内存数据过程

1.准备材料:xxx.dump转储文件,VS2022 2.提取过程 使用VS打开xxx.dump文件VS中点击 调试托管内存 按钮查找需要导出的变量,注:通过类型查找时基础变量类型跟原类型不一样,如string对应String,bool对应Bool…

Nacos学习文档

目录 1、Nacos是什么2、Nacos名词介绍3、Nacos中的data id是如何组装的?4、Nacos 融合 Spring Cloud,成为注册配置中心4.1、Maven依赖作用4.2、启动配置管理4.2.1、添加依赖4.2.2、在 bootstrap.yml(也支持properties格式) 中添加…

QT简易项目 数据库可视化界面 数据库编程SQLITE QT5.12.3环境 C++实现

案例需求&#xff1a; 完成数据库插入&#xff0c;删除&#xff0c;修改&#xff0c;查看操作。 分为 插入&#xff0c;删除&#xff0c;修改&#xff0c;查看&#xff0c;查询 几个模块。 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget…

【Linux学习】【Ubuntu入门】2-3 make工具和makefile引入

1.使用命令新建三个.c文件vi main.c&#xff0c;vi input.c&#xff0c;vi caclcu.c&#xff0c;两个.h文件vi input.h&#xff0c;vi caclcu.h 2.vi Makefile&#xff1a;新建Makefile文件&#xff0c;输入一下内容 注意&#xff1a;命令列表中每条命令前用TAB键&#xff0c;不…

Gazebo仿真实现无人机+Apriltag码动态跟踪

目录 演示 一、环境 二、配置 创建模型 首先相机创建 添加相机 Apriltag创建 地图添加apriltag码 Apriltag_ros配置 三、代码运行 四、问题 修改相机模型的参数 演示 一、环境 ROSgazebo配置 Px4Mavros Apriltag_ros编译 二、配置 在默认的mavros_posix_sitl.l…

H.265流媒体播放器EasyPlayer.js播放器提示MSE不支持H.265解码可能的原因

随着人工智能和机器学习技术的应用&#xff0c;流媒体播放器将变得更加智能&#xff0c;能够根据用户行为和偏好提供个性化的内容推荐。总体而言&#xff0c;流媒体播放器的未来发展将更加注重技术创新和用户互动&#xff0c;以适应不断变化的市场需求和技术进步。 提示MSE不支…

加菲工具 - 好用免费的在线工具集合

加菲工具 https://orcc.online AI 工具 集合了目前主流的&#xff0c;免费可用的ai工具 文档处理 pdf转word、office与pdf互转等等工具都有链接 图片图标 统计了好用免费的在线工具 编码解码 base64编码解码、url编码解码、md5计算、进制转换等等 其它 还有其他好用的…

【linux学习指南】初识Linux进程信号与使用

文章目录 &#x1f4dd;信号快速认识&#x1f4f6;⽣活⻆度的信号&#x1f4f6; 技术应⽤⻆度的信号&#x1f309; 前台进程&#xff08;键盘&#xff09;&#x1f309;⼀个系统函数 &#x1f4f6;信号概念&#x1f4f6;查看信号 &#x1f320; 信号处理&#x1f309; 忽略此信…

今天你学C++了吗?——C++中的类与对象(第二集)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

Anaconda3 2024 jupyter notebook 配置默认文件路径

我的版本如下&#xff1a; 第一步&#xff1a; 打开命令行anaconda prompt &#xff0c; 敲下面命令生成配置文件 jupyter notebook --generate-config 如下图&#xff1a; 修改配置jupyter_notebook_config.py 文件中搜索c.ServerApp.root_dir &#xff08; 对于 Anac…

【抓包专题】burpsuitProxifier小程序抓包

抓包系列文章 burpsuit&Proxifier&小程序抓包 抓包系列文章前言一、工具下载二、获取证书并安装到本地三、抓包测试 前言 抓包是进行渗透的第一步&#xff0c;包都抓不到&#xff0c;渗透就不要谈了&#xff0c;废话少说&#xff0c;开干 一、工具下载 Proxifier安装使…

springboot 异步 @Async 的日常使用及失效场景

文章目录 springboot 异步 Async 的日常使用引言一、Async 使用位置二、Async 使用三、注解 Async 失效的情况&#xff08;1&#xff09;调用同一个类中的异步方法&#xff08;内部调用&#xff09;&#xff08;2&#xff09;未使用 EnableAsync 注解&#xff08;3&#xff09;…

WebGIS技术汇总

WebGIS系统通常都围绕地图进行内容表达&#xff0c;但并不是有地图就一定是WebGIS&#xff0c;所以有必要讨论下基于Web的地图API分类及应用场景。 Web上的Map API主要分类如下几类&#xff1a; Charts&#xff1a;以D3.js&#xff0c;Echarts等为代表。LBS&#xff1a;以高德…

使用Vue3来实现一个倒计时器以及倒计时任务

本内容使用Vue3&#xff0c;以及element-plus辅助开发。 首先展示倒计时器的功能&#xff1a; 手动设置倒计时器的倒计时时间开始倒计时按钮暂停倒计时按钮重新开始倒计时按钮 其次展示倒计时任务管理界面功能&#xff1a; 创建倒计时任务选择任务并进行倒计时删除任务 目录 一…

VMware Workstation 虚拟机运行卡顿解决方案

前言 由于我们网站主力是模拟器多开&#xff0c;VMware虚拟机纯属我个人使用的经验&#xff0c;仅供参考。顺带一提&#xff1a;多开鸭的系统精简掉的是Hyper-V&#xff0c;跟VMware完全没有任何关系&#xff0c;Hyper-V跟雷电这些模拟器会冲突&#xff0c;但是移除之后不会影…

GitLab|应用部署

创建docker-compose.yaml文件 输入docker-compose配置 version: 3.8 services:gitlab:image: gitlab/gitlab-ce:15.11.2-ce.0restart: alwayscontainer_name: gitlab-ceprivileged: truehostname: 192.168.44.235environment:TZ: Asia/ShanghaiGITLAB_OMNIBUS_CONFIG: |exter…