使用dbms_repair修复块损坏的例子

实战篇:Oracle 数据坏块的 N 种修复方式 坏块修复的N种方法 阅读详情

dbms_repair是从oracle8i开始提供的。

我们可以用设置event的方法来处理坏块:

http://www.itpub.net/showthread.php?threadid=201766&pagenumber=

但是当数据量很大,或7*24的系统时,这样的方法就不是很合适了。这里我们使用dbms_repair来处理。

SQL> create tablespace block datafile 'D:/oracle/oradata/oracle9i/block.dbf' size 5M;

Tablespace created

SQL> connect dlinger/dlinger
Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0
Connected as dlinger

QL> create table test tablespace block as select * from all_tables;

Table created

SQL> insert into test select * from test;

806 rows inserted

SQL> insert into test select * from test;

1612 rows inserted

SQL> insert into test select * from test;

3224 rows inserted

SQL> insert into test select * from test;

6448 rows inserted

SQL> insert into test select * from test;

insert into test select * from test

ORA-01653: 表DLINGER.TEST无法通过128(在表空间BLOCK中)扩展

SQL> commit;

Commit complete

SQL> select count(*) from test;

  COUNT(*)
----------
     12896

SQL> create index i_test on test(table_name);

Index created

SQL> alter system checkpoint;

System altered


SQL> connect sys/sys as sysdba
已连接。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

--使用UltraEdit编辑block.dbf,修改几个字符

SQL> startup
ORACLE 例程已经启动。

Total System Global Area   72424008 bytes
Fixed Size                   453192 bytes
Variable Size              46137344 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> select count(*) from dlinger.test;
select count(*) from dlinger.test
                             *
ERROR 位于第 1 行:
ORA-01578: ORACLE 数据块损坏(文件号14,块号160)
ORA-01110: 数据文件 14: 'D:/ORACLE/ORADATA/ORACLE9I/BLOCK.DBF'


用dbv检查:
C:/Documents and Settings/duanl>dbv file='D:/oracle/oradata/oracle9i/block.dbf'
blocksize=8192

DBVERIFY: Release 9.2.0.1.0 - Production on 星期二 8月 24 19:58:15 2004

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

DBVERIFY - 验证正在开始 : FILE = D:/oracle/oradata/oracle9i/block.dbf
标记为损坏的页160
***
Corrupt block relative dba: 0x038000a0 (file 14, block 160)
Bad check value found during dbv:
Data in bad block -
 type: 6 format: 2 rdba: 0x038000a0
 last change scn: 0x0000.0035f5c2 seq: 0x1 flg: 0x06
 consistency value in tail: 0xf5c20601
 check value in block header: 0x3681, computed block checksum: 0x5bb
 spare1: 0x0, spare2: 0x0, spare3: 0x0
***

 

DBVERIFY - 验证完成

检查的页总数         :640
处理的页总数(数据):510
失败的页总数(数据):0
处理的页总数(索引):0
失败的页总数(索引):0
处理的页总数(其它):9
处理的总页数 (段)  : 0
失败的总页数 (段)  : 0
空的页总数            :120
标记为损坏的总页数:1
汇入的页总数           :0

使用dbms_repair包
1.创建管理表:
SQL> connect sys/sys as sysdba
Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0
Connected as SYS

SQL> exec DBMS_REPAIR.ADMIN_TABLES('REPAIR_TABLE',1,1,'USERS');

PL/SQL procedure successfully completed

SQL> exec DBMS_REPAIR.ADMIN_TABLES('ORPHAN_TABLE',2,1,'USERS');

PL/SQL procedure successfully completed


2.检查坏块:dbms_repair.check_object

SQL> declare
  2  cc number;
  3  begin
  4  dbms_repair.check_object(schema_name => 'DLINGER',object_name => 'TEST',cor
rupt_count => cc);
  5  dbms_output.put_line(a => to_char(cc));
  6  end;
  7  /
1

PL/SQL 过程已成功完成。     

看到这里用dbms_repair.check,检查的结果corrupt_count=1,有一个块损坏,和dbv的结果一致。

check完之后,在我们刚在创建的REPAIR_TABLE中查看块损坏信息:   

SQL> SELECT object_name, relative_file_id, block_id,marked_corrupt, corrupt_description, repair_description,                                                                                                                                              
  2  CHECK_TIMESTAMP from repair_table;                                                                                                                                                                                                                   
                                                                                                                                           
OBJECT_NAME    RELATIVE_FILE_ID   BLOCK_ID MARKED_CORRUPT CORRUPT_DESCRIPTION   REPAIR_DESCRIPTION           CHECK_TIMESTAMP
-------------- ---------------- ---------- -------------- --------------------- ---------------------------- ---------------
TEST                         14        160 TRUE                                 mark block software corrupt  2004-8-24 21:46

在这个table中,可以看到损坏的block的信息,这里的信息和我们用dbv得到的一致。
我们这个实验是在9i下模拟的,我们注意看MARKED_CORRUPT的值,这里经过check_object后,已经标识为TRUE了。
所以可以直接进行第四步了。
按照oracle文档上的说法,在8i下,check_object只会检查坏块,MARKED_CORRUPT为false
需要使用第3步,fix_corrupt_blocks定位 ,修改MARKED_CORRUPT为true,同时更新CHECK_TIMESTAMP。
这里我们经过实验,确认在9i下跳过第3步,是完全可行的。
那么8i是否需要执行第三步,我没有实验过,但推测应该是不可以跳过的。  

3.定位坏块:dbms_repair.fix_corrupt_blocks     

只有将坏块信息写入定义的REPAIR_TABLE后,才能定位坏块。 
declare
cc number;
begin
dbms_repair.fix_corrupt_blocks(schema_name => 'DLINGER',object_name => 'TEST',fix_count => cc);
dbms_output.put_line(a => to_char(cc));
end;

4.跳过坏块:

我们前面虽然定位了坏块,但是,如果我们访问table:
SQL> select count(*) from dlinger.dbblock;

select count(*) from dlinger.dbblock

ORA-01578: ORACLE 数据块损坏(文件号14,块号154)
ORA-01110: 数据文件 14: 'D:/ORACLE/ORADATA/ORACLE9I/BLOCK.DBF'

还是会得到错误信息。   
这里需要用skip_corrupt_blocks来跳过坏块:

SQL> exec dbms_repair.skip_corrupt_blocks(schema_name => 'DLINGER',object_name => 'TEST',flags => 1);

PL/SQL procedure successfully completed

SQL> select count(*) from dlinger.test;

  COUNT(*)
----------
     12850


丢失了12896-12850=46行数据。

 

5.处理index上的无效键值;dump_orphan_keys

declare
cc number;
begin
dbms_repair.dump_orphan_keys(schema_name => 'DLINGER',object_name => 'I_TEST',object_type => 2,
repair_table_name => 'REPAIR_TABLE',orphan_table_name => 'ORPHAN_TABLE',key_count => CC);
end;
/

SQL> SELECT * FROM ORPHAN_TABLE;

SCHEMA_NAME    INDEX_NAME  IPART_NAME     INDEX_ID TABLE_NAME  PART_NAME    TABLE_ID KEYROWID               KEY                                        DUMP_TIMESTAMP
-------------- ----------- ------------ ---------- ----------- ---------- ---------- ---------------------- ------------------------------------------ --------------
DLINGER        I_TEST                        30258 TEST                        30257 AAAHYxAOwAAAIADA0A     *BAAAAAAMTE9HTU5SQ19HU0lJ/g                2004-8-25 22:1
DLINGER        I_TEST                        30258 TEST                        30257 AAAHYxAOwAAAIADAsA     *BAAAAAAMTE9HTU5SQ19HVExP/g                2004-8-25 22:1
..............................................

DLINGER        I_TEST                         30258 TEST                        30257 AAAHYxAOwAAAIADB0A     *BAAAAAAPTE9HTU5SX0xPQkZSQUck/g          2004-8-25 22:1
DLINGER        I_TEST                         30258 TEST                        30257 AAAHYxAOwAAAIADBYA     *BAAAAAAMTE9HTU5SX1RZUEUk/g              2004-8-25 22:1
DLINGER        I_TEST                         30258 TEST                        30257 AAAHYxAOwAAAIADAQA     *BAAAAAALTE9HTU5SX1VJRCT+                2004-8-25 22:1
DLINGER        I_TEST                         30258 TEST                        30257 AAAHYxAOwAAAIADAoA     *BAAAAAAMTE9HTU5SX1VTRVIk/g              2004-8-25 22:1

46 rows selected

和上面我们看到的损失的数据行数吻合。

我们根据这个结果来考虑是否需要rebuild index.

 

6.重建freelist:rebuild_freelists

SQL> exec dbms_repair.rebuild_freelists(schema_name => 'DLINGER',object_name => 'TEST');

PL/SQL procedure successfully completed

把 sy-* 带进 ABAP CDS:ABAP 7.50 里的环境信息新姿势($session 与 @Environment.systemField 实战) 摘要:ABAP 7.50在CDS视图中引入两种获取环境信息的方式:1)直接使用$session会话变量读取用户、客户端和系统语言;2)通过@Environment.systemField注解参数,由Open SQL自动注入系统字段。$session方式简单但依赖Open SQL访问路径,非ABAP环境下可能失效;注解参数方案更工程化,依赖关系明确且支持测试。建议ABAP体系内优先使用$session,对外接口采用参数化方案。两种方式各有适用场景,正确选择可避免潜在风险。(148字) 阅读详情

相关推荐

zynq-7000学习笔记(八)——USB摄像头图像采集

PC平台:WINDOWS 10 64位 Xilinx设计开发套件:Xilinx_vivado_sdk_2015.4 开发板:Zed Board USB摄像头:罗技 C270(720P) linux源码:2016_R1 一、配置linux,支持UVC       如果是中星微的ZC3XX系列的芯片,则要进到GSPCA把ZC3XX的驱动选上

luotong86的专栏 1万+

26.DBMS_REPAIR坏块修复

DBMS_REPAIR修复坏块

weixin_43346403的博客 710

如何评估一颗 AI 芯片的真实性能?TOPS、FPS 与 Token/sec 全解析

AI 芯片在实际部署中,其理论峰值性能往往无法反映真实执行效率。如何科学评估一颗 AI 芯片的“真实性能”,已成为芯片选型与系统集成环节中的关键技术问题。本文从工程实战角度出发,深入拆解当前常用性能评估指标(TOPS、FPS、Token/sec)背后的定义逻辑与使用陷阱,并结合推理模型部署与执行路径,系统讲解 AI 芯片在不同场景下的性能验证方法。通过对芯片算力-功耗-调度三维关系的分析,读者将掌握评估一颗 AI 芯片是否“跑得动业务”的核心判断能力。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3386

Oracle坏块处理之dbms_repair的用法

1、模拟坏块 SQL> create tablespace test01 datafile 'G:oracleproduct10.2.0oradataora10gtest01.dbf' ...

csh1951914的博客 1124

从零到一:基于Matlab的二阶系统时域性能指标计算与可视化实战

本文提供了一份基于Matlab的二阶系统时域性能指标计算与可视化实战指南。通过详细的代码示例,手把手教你如何利用Matlab计算超调量、调节时间等关键指标,并绘制阶跃响应曲线进行可视化分析,帮助控制工程学习者和从业者快速掌握系统性能评估方法。

weixin_29096377的博客 268

第一天(点亮led灯+led灯闪烁)——Arduino uno R3 学习之旅

发光二极管(Light Emitting Diode,简称LED)是一种能够将电能转化为光能的固态的半导体器件。长脚为阳极短脚为阴极电流必须从长脚流入从短脚流出方可点亮LED##杜邦线杜邦线:是导线中的一种,杜邦线端部有两种接头形式:带针的一种称为公头,带孔的一种称为母头,如下图所示:说明:与电源相连接时,一般采用红色杜邦线,与地连接时采用黑色杜邦线。

qwsbcjendb的博客 1130

使用DBMS_REPAIR包跳过坏块

1、创建测试表 SQL> conn help/admin Connected. SQL> create table h1 as select * from dba_objects; Table created. SQL> select table_name from user_tables; TABLE_NAME ——————— H1 SQL> select count(*) from h1; COUNT(*) —————— 86414 2、查看表的相关信息 select segme

loveLAxin的博客 546

【LLM】ms-Swift框架下SFT与GRPO协同优化的高效训练策略

本文深入探讨了ms-Swift框架下监督微调(SFT)与群组相对策略优化(GRPO)的协同训练策略,提升大型语言模型(LLM)的性能与效率。通过创新的架构设计和两阶段训练流程,结合GRPO的群组奖励估计与动态基线调整技术,显著优化了数学推理等任务的准确率。文章还分享了计算资源高效利用和参数调优的实战经验,为LLM训练提供了实用指导。

green的博客 994

oracle dbms_repair,数据文件出现坏快的解决之一(如何利用dbms_repair来标记和跳过坏块)...

http://blog.chinaunix.net/u1/50863/showart_400574.html第一步:准备试验环境(建表空间,用户,表,初始化一些数据,然后破坏对应的数据文件)E:\Oracle\ora92\bin>sqlplus "/ assysdba"SQL*Plus: Release 9.2.0.4.0 - Production on 星期一3月 8 20:27:15 2...

weixin_35006125的博客 446

如何从RHEL 8升级到RHEL 9

Red Hat 于 2022 年 5 月 17 日宣布全面推出 RHEL 9。这是 RHEL(Red Hat Enterprise Linux)的最新版本,它具有许多功能和增强功能。

u012748257的博客 1019

【OpenClaw从入门到精通】第41篇:2026年4月最新版——从零开始搭建你的第一个安全AI助理(保姆级实战教程)

2026年3月CNCERT联合发布《OpenClaw安全使用实践指南》后,安全部署成为OpenClaw使用的核心前提。本文针对新手及进阶用户,基于官方安全指引,提供三套实战部署方案:阿里云一键部署(新手首选)、Docker容器隔离部署(进阶推荐)、本地安全安装(测试专用),并详解阿里云百炼Coding Plan API接入流程。全文涵盖环境准备、分步实操、安全加固、问题排查等全流程,所有命令可直接复制执行,无需依赖外部代码库。通过本文,读者可零基础搭建安全隔离的OpenClaw AI助理,兼顾实用性与安全性

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2197

oracle坏块修复步骤(索引坏块rebuild和表表坏块用rman,dbms_repair恢复)

b)如果是文件系统且没做raid,但有备份和归档,在messages里会显示具体哪个磁盘出问题了,更换磁盘,然后用数据文件备份和归档、在线日志恢复到最后的时间点。,oracle会对基表加share锁,由于share锁和row-X是不兼容的,也就是说,在建立索引期间,无法对基表进行DML操作。实际上,oracle在rebuild时,在创建新索引过程中,并不会删除旧索引,直到新索引rebuild成功。c)如果是文件系统且没做raid,没有备份,那么就要按下面的步骤3里的操作恢复好坏块后,再更换磁盘。

一个只求实际的程序猿 3823

归结法证明真题分析

本文主要探讨了逻辑证明题的三种核心形式及其解题策略。第一类为A1∧A2∧A3→B的证明,常采用线性、单元、支持策略法等归结法,典型案例包括使用归纳法证明特定逻辑公式,并列举了历年真题。第二类为集合交集证明,典型案例为证明任意集合S和T的交集S∩T是S的子集,需将交集和包含关系用逻辑式表达。第三类为常规归结法证明,真题示例为使用归结法证明特定逻辑蕴含关系。掌握前两类证明方法后,第三类问题自然迎刃而解。

super_mochi1 278

oracle dbms_repair,oracle实验-使用dbms_repair修复块损坏

使用dbms_repair修复块损坏的例子dbms_repair是从oracle8i开始提供的。我们可以用设置event的方法来处理坏块:但是当数据量很大,或7*24的系统时,这样的方法就不是很合适了。这里我们使用dbms_repair来处理。SQL> create tablespace block datafile 'D:\oracle\oradata\oracle9i\block.dbf...

weixin_32200323的博客 402

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Oracle数据库修复利器:DBMS_REPAIR包详解与实战

过程,用于检查和修复数据文件中的坏块。为了应对这种情况,Oracle提供了DBMS_REPAIR包,这是一个强大的工具,可以帮助我们发现、标识并修复数据文件中的坏块。首先,他们使用DBMS_REPAIR.CHECK_OBJECT过程检查了表的数据文件,并确认了坏块的存在。DBMS_REPAIR包作为Oracle数据库中的一项重要功能,为我们提供了一种有效的手段来应对数据文件中的坏块问题。假设某公司在使用Oracle数据库时,发现某个表的数据出现异常,经过排查发现是由于数据文件中的坏块导致的。

A17317974667的博客 1354

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

使用 DBMS_REPAIR 修复坏块

对于Oracle数据块物理损坏的情形,在我们有备份的情况下可以直接使用备份来恢复。对于通过备份恢复,Oracel为我们提供了很多种方式,冷备,基于用户管理方式,RMAN方式等等。对于这几种方式我们需要实现基于数据库以及文件级别的恢复。RMAN同时也提供了基于块介质方式的恢复。也就是说我们根本不需要还原数据文件,而是直接从备份文件基于块来提取以实现联机恢复。可参考基于RMAN实现坏块介质恢复(blo...

Data & Analysis 595

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

dbms_repair包修复损坏的数据块

dbms_repair包含修复损坏数据块的存储过程,可以检查表和索引数据块损坏的情况,然后标记坏块,再使用表的时候会绕过坏块,但是坏块中的数据会丢失。 ---创建测试表空间 SYS@orcl>create tablespace test datafile '/u01/app/oracle/oradata/orcl/test01.dbf' size 5m; Tablespace creat

Oracle Database 1090

DBMS_REPAIR 工具包的使用

DBMS_REPAIR 工具包的使用虽然DBMS_REPAIR 是一个程序包,它也是DBA的一个工具.通过运行DBMS_REPAIR 包,oracle 给出关于损坏块的详细信息,并告诉用户如何修复他们DBMS_REPAIR 包记录了关于损坏块的全部详细信息,并在一个称为REPAIR_KEY的特殊表中记录定位指示,在这里key可以是用户选择的任何名字,我们使用REPAIR_ADMIN创建改表,在针对

bjguan's BLOG 1363

DBMS_REPAIR包修复损坏数据块

source:http://oracle.chinaitlab.com/1 、DBMS_REPAIR包的使用 Oracle提供的DBMS_REPAIR包可以发现、标识并修改数据文件中的坏块。 DBMS_REPAIR包的工作原理比较简单——将检查到的坏块标注出来,使随后的dml操作跳过该块。同时,DBMS_REPAIR包还提供了几个过程,可以用来保存索引的键值(这些键值指向被标注为坏块的

幽州客的专栏 1613

DBMS_REPAIR

DBMS_REPAIR只是把table及index的corruption blocks标识后忽略,在下次查询或操作时不会对corruption blocks操作,不会对corruption block进行数据恢复 TheDBMS_REPAIRpackage contains data corruption repair procedures that enable you to detect and repair corrupt blocks in tables and indexes. (...

彦祖的小号的博客 576

mysql修复坏块_使用 DBMS_REPAIR 修复坏块

对于Oracle数据块物理损坏的情形,在我们有备份的情况下可以直接使用备份来恢复。对于通过备份恢复,Oracel为我们提供了很多种方对于Oracle数据块物理损坏的情形,在我们有备份的情况下可以直接使用备份来恢复。对于通过备份恢复,Oracel为我们提供了很多种方式,冷备,,基于用户管理方式,RMAN方式等等。对于这几种方式我们需要实现基于数据库以及文件级别的恢复。RMAN同时也提供了基于块介质方...

weixin_31508009的博客 260

dbms_repair的使用

本文来自网上 原文地址: http://blueocean926.itpub.net/post/38439/484464  select file_id, block_id from dba_extents where segment_name = TEST AND OWNER=APPS;FILE_ID BLOCK_ID4 336094 336174 336254 33

pconline_dba的专栏 645

oracle dbms_repair,dbms_repair的使用

select file_id, block_id from dba_extents where segment_name = 'TEST' AND OWNER='APPS';FILE_ID BLOCK_ID4 336094 336174 336254 336334 336414 336494 336574 336654 336734 ...

weixin_32287801的博客 232

java ClockRepairs_使用DBMS_REPAIR包修复坏块(一)

使用DBMS_REPAIR包修复坏块(一)今天来学习一下数据坏块的检测和修复。Oracle为了检测和纠正数据块随坏,提供了不同的方法,纠正方法有很多,第一是在检测到损坏之后,就删除并重建该对象,但是这个方法有时是不可用的,而且效果也不理想。如果数据块损坏局限于行的子集,则可以选取除了损坏行之外的所有行来重建表。第二个方法是使用DBMS_REPAIR包来检测和修复表或索引中的损坏数据块。这个方法的好...

weixin_30705133的博客 251

DBMS_REPAIR SCRIPT (Doc ID 556733.1)

DBMS_REPAIR SCRIPT (Doc ID 556733.1)

LuciferLiu_DBA 528

oracle example mysql_DBMS_REPAIR example

PURPOSEThis document provides an example of DBMS_REPAIR as introduced in Oracle 8i.Oracle provides different methods for detecting and correcting data blockcorruption - DBMS_REPAIR is one option.WARNI...

weixin_35765731的博客 156
上一篇: 如和使用oracle的LogMiner工具
下一篇: Oracle中各数据类型的存储方式(转贴及个人的一点探讨)
dlinger
博客等级 码龄24年 2粉丝 18原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值