使用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

微信小游戏CE修改实战:从入门到精通(附防作弊思路) 本文深入探讨微信小游戏的安全攻防实战,重点分析CE修改、反编译和重打包等安全风险。通过详细的内存修改案例和代码保护方案对比,提供从客户端到服务端的全方位防护策略,帮助开发者构建有效的防作弊体系。 阅读详情

相关推荐

从零开始:用ADS仿真设计一个2.4GHz Wi-Fi低噪声放大器(含完整电路图)

本文提供了一份详细的ADS软件仿真指南,手把手教你从零开始设计一个2.4GHz Wi-Fi低噪声放大器。内容涵盖核心指标理解、晶体管选型与建模、匹配网络设计、偏置电路集成,并通过S参数仿真、噪声优化及线性度验证等步骤,最终呈现完整的优化电路图,助力射频初学者掌握LNA设计全流程。

weixin_29197835的博客 805

26.DBMS_REPAIR坏块修复

DBMS_REPAIR修复坏块

weixin_43346403的博客 710

OnlyOffice Docker部署全攻略:解除连接限制+文件大小限制+中文字体优化

本文详细介绍了OnlyOffice企业级Docker部署的完整解决方案,重点破解连接限制、文件大小限制和中文字体优化三大核心痛点。通过定制化镜像部署、性能调优配置和中文字体深度优化,帮助企业实现高效稳定的文档协作平台。

weixin_28837817的博客 366

Oracle坏块处理之dbms_repair的用法

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

csh1951914的博客 1124

ArcGIS实战:手把手教你用DEM和灾害点数据,5步搞定地质灾害风险区划图

本文详细介绍了使用ArcGIS进行地质灾害风险评估的完整流程,从DEM和灾害点数据出发,通过五步标准化操作生成专业风险区划图。重点讲解了信息量模型的应用,帮助读者掌握GIS技术在地质灾害易发性评价中的实践方法,提升风险评估效率与准确性。

weixin_30696427的博客 424

利用eds editor生成CANOPEN 设备eds文件

通过以上步骤,您可以根据实际设备的功能特性,自动生成一份符合CANopen协议标准的电子数据表(EDS文件),该文件可以被上位机软件或其他CANopen主站设备用于识别、配置和控制您的CANopen从站设备。使用CANopen EDS Editor生成CANOPEN设备的EDS文件是一个系统化的过程,它涉及将设备的具体技术参数和功能映射到CANopen规范定义的对象字典中。

weixin_38604759的博客 6458

使用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

使用 Python 和可视化编程控制树莓派机械臂myCobot

这些模块包括逻辑、循环、数学、文本、列表、颜色、变量、函数以及控制机械臂的函数等等,所以用户可以轻松入门编程,只需单击右上角的运行就可以启动程序,做一些有趣的应用。可以搭配任意摄像头进行图像识别,具有4个 USB 端口,可以通过 Raspberry Pi 的微型 HDMI 端口连接到显示器. 最后,40 个GPIO 接头可以进行更多扩展应用,机械臂每个接口都有清晰的标记,面板上还有一个电源开关和一个直流电源插孔。您现在可以将机器人放在地板或桌子上,并用力拧紧吸盘,以确保机械臂的底座在操作过程中不会移动。

m0_62456998的博客 3965

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

基于STM32的电子琴音乐播放器设计

​ 本设计以实际电路为最后的结果,实现了所有与其功能,具有重要的现实意义。件,在Proteus中进行原理图绘制,然后把 .hex文件下载到STM32F103RBT6中 进行仿真。由于网络上 下载的 Proteus中 没有 STM32F103RBT6这个芯片型号,我们又从网上 下载芯片 进行仿真。​ 本设计以实际电路为最后的结果,实现了所有与其功能,具有重要的现实意义。

TMMXA的博客 2万+

Spring Boot 3.2 集成 Shiro 2.0.1 踩坑实录:从 javax.servlet 到 jakarta.servlet 的完整迁移指南

本文详细介绍了Spring Boot 3.2集成Shiro 2.0.1时遇到的从javax.servlet到jakarta.servlet的迁移问题,提供了完整的解决方案和迁移指南。通过Maven依赖配置和代码调整,帮助开发者顺利跨越Jakarta EE的兼容性鸿沟,确保Shiro权限控制在Spring Boot 3.2环境中正常运行。

weixin_42570296的博客 482

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

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

一个只求实际的程序猿 3823

Uniapp返回上一页并刷新:亲测有效的 goBack 实现技巧!

这个技巧在实际开发中非常常用,特别适合表单提交后返回列表刷新这类场景。比起依赖onShow或复杂的vuex状态同步,这种方式更直接、好维护,也不容易出 bug。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1841

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

A17317974667的博客 1354

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

使用 DBMS_REPAIR 修复坏块

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

Data & Analysis 595

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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、付费专栏及课程。

余额充值