Oracle数据块损坏恢复总结

Oracle数据块损坏恢复总结

在恢复前使用DBV命令检查数据文件是否存在坏块
dbv file=d:\oracle\oradata\mydb\RONLY.DBF blocksize=8192
查看数据坏块所在数据文件号及块号可以对表进行一次全表扫描,如:
select count(*) from tablename;
1、    没有备份的情况下:

1.1、使用exp/imp恢复
  在这种情况下肯定会造成数据的丢失,在这种情况下应采取将数据导出然后重建表再进行导入的方法,来尽量恢复损坏数据块中的数据,但是在有坏块的情况下是不允许导出的,如下命令:
  Exp test/test file=t.dmp tables=t;
  导出命令在执行中会报ORA-01578错误,在这错误提示中会提示那个文件号的文件以及这个文件中的哪个块被损坏,如:ORA—01578:ORACLE 数据块损坏(文件号 4,块号 35)
  针对以上的提示首先查询那些对象被损坏:
  Select tablespace_name,segment_type,owner,segment_name From dba_extents Where file_id=4 and 35 between block_id and block_id+blocks-1;
如果被损坏的块是索引,通常可以通过索引重建来解决,如果损坏的是数据(segment_type为table),那么通过设置如下内部事件使得Exp操作跳过坏块。
Alter session set events=’10231 trace name context forever,level 10’;
然后重新执行导出命令,导出相关的表,然后执行Drop Table命令删除相关表,之后重建表最后导入数据。

1.2、使用DBMS_REPAIR恢复
用DBMS_REPAIR当然也会丢失数据。这里不做详细的介绍,有兴趣的可以查看oracle的在线文档

2、使用Rman进行恢复:
  首先要存在Rman的最新备份集,然后执行如下命令:
RMAN>backup validate datafile 4;检查4号数据文件是否存在坏块
执行查询:select * from v$database_block_corruption where file#=4;
如果4号文件存在坏块的话,那么将在结果集中有所显示,会显示损坏的块号,根据显示结果执行如下命令进行恢复:
RMAN>blockrecover datafile 4 block 35 from backupset;
该命令执行后即可恢复坏块,并且不会造成数据丢失,但是要求数据库必须要运行在归档模式下,否则RMAN无法发挥作用,而且通过RMAN做过最新的数据库备份

3、使用bbed恢复
使用bbed恢复时必须有数据文件的拷贝。
bbed就是英文block browse edit的缩写,用来直接查看和修改数据文件数据的一个工具。
在windows和linux上面都有
但在linux下需要编译:
然后把$ORACLE_HOME/rdbms/lib加到环境变量的PATH里面,就可以直接在命令中bbed了。
BBED的缺省口令为blockedit,For Oracle Internal Use only 请谨慎使用Oracle不做技术支持。
[oracle@test oracle]$ cd $ORACLE_HOME/rdbms/lib
[oracle@test lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
进入bbed后,可以使用help查看帮助
BBED> help
bbed的详细用法这里不做具体介绍。
详细用法可以参考:
http://www.sosdb.com/jdul/dispbbs.asp?boardID=1&ID=237

时间: 2024-09-20 14:41:16

Oracle数据块损坏恢复总结的相关文章

oracle 01578 数据块损坏 怎么忽略

问题描述 oracle 01578 数据块损坏 怎么忽略 windows 2008 oracle 11 非归档模式 数据库启动时没有错误提示.写入数据时会提示01578,这个数据文件在一个大的空间里(有很多数据文件).我把它offline drop 后,查询它的状态是available.再写入数据时会提示01110错误,用recover 不成功,因为没有归档的日志. 请问:我能否在offline前把这个坏块的错误忽略掉?或者我在offline后不让数据库再去访问这个数据文件呢? 解决方案 在 e

Oracle中模拟及修复数据块损坏

在Oracle数据库中,我们可能遭遇很多数据损坏的情况,在面对这些情况时如何进行数据恢复是非常重要的.在很多情况下,恢复是极其复杂的,而且需要谨慎,轻率的操作和尝试可能导致数据库的永久损坏. 所以我建议在恢复尝试前应当先进行数据备份. 对于重要的数据库,如果不能确定恢复步骤和操作后果,建议最好先向专业人士进行咨询,以避免不必要的数据损失. 本文通过试验模拟和解决数据块损坏问题,是对一类数据库损坏的恢复探讨 1.插入数据 E:\Oracle\ora92\bin>sqlplus "/ as s

Oracle数据块恢复(dbv、BMR)

Oracle数据块恢复(dbv.BMR) 物理坏块和逻辑坏块 Oracle数据文件的坏块可以分为物理坏块和逻辑坏块.物理坏块指的是块格式本身已经损坏,块内的数据没有任何意义.而逻辑坏块,指的是块内的数据在逻辑上存在问题,比如说索引块的索引值没有按从小到大排列导致的逻辑坏块.物理坏块一般是由于内存问题.OS问题.I/O子系统问题或硬件引起的,逻辑坏块一般是有Oracle bug等原因引起的. 各种各样的块损坏通常是通过Oracle的ORA-1578错误报告出来的,详细的损坏描述会在告警日志中打印出

Oracle数据块原理深入剖析

数据块(Oracle Data Blocks),本文简称为"块",是Oracle最小的存储单位,Oracle数据存放在"块"中.一个块占用一定的磁盘空间.特别注意的是,这里的"块 "是Oracle的"数据块",不是操作系统的"块". Oracle每次请 求数据的时候,都是以块为单位.也就是说,Oracle每次请求的数据是块的整数倍.如果Oracle请求的数据量不到一块,Oracle也会读取整个块.所以说,&

oracle数据文件,恢复数据库问题

问题描述 oracle数据文件,恢复数据库问题 一直用的mysql,今天老板突然给我一个oracle的文件,说让我恢复oracle数据库,表示搞不定请教诸位.

Oracle数据块实现原理深入解读_oracle

下午在学习oracle 10g r2 concepts 在这留一笔. Oracle对数据库数据文件(datafile)中的存储空间进行管理的单位是数据块(data block).数据块是数据库中最小的(逻辑)数据单位.与数据块对应的,所有数据在操作系统级的最小物理存储单位是字节(byte).每种操作系统都有一个被称为块容量(block size)的参数.Oracle每次获取数据时,总是访问整数个(Oracle)数据块,而不是按照操作系统块的容量访问数据. 数据库中标准的数据块(data bloc

[20161123]oracle数据块类型.txt

[20161123]oracle数据块类型.txt --oracle 数据块有许多类型,自己平时很少关注与记忆,自己做一个归纳总结: 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- ------------------------------------------------------

【体系结构】Oracle数据块详解

Oracle数据块详解 操作系统块是操作系统读写的最小操作单元,也是操作系统文件的属性之一.当创建一个Oracle数据库时,选择一个基于操作系统块的整数倍大小作为Oracle数据库块的大小.Oracle数据库读写操作则是以Oracle块为最小单位,而非操作系统块. 数据库块也称逻辑块或Oracle块,它对应磁盘上一个或多个物理块,它的大小由初始化参数DB_BLOCK_SIZE决定,可以定义数据块为2K.4K.8K.16K.32K甚至更大,默认Oracle块大小是8K.若一旦设置了Oracle数据

oracle数据块如何进行一致性检查

什么是数据块一致性? 每一个数据块头部都有一个"校验和"字段 当数据块被写回磁盘前,Oracle会重新计算这个校验和 并记录到这个字段,最终写回磁盘 下次数据块被读入内存时,Oracle会重新计算数据块的校验和 并与校验和字段中的值相比较 如果有差异,Oracle就会抛出ORA-1578 也就是,整个校验过程: 写回时,计算并保存 读入时,计算并比较 通过校验和字段进行检查叫物理一致性检查,其侧重于硬件故障,并不关心内容正确与否 而逻辑一致性检查便是接手这任务,如:记录和索引是否对应: