Oracle数据块损坏恢复总结

数据库 Oracle 数据库运维
文章介绍了Oracle数据库中数据块损坏恢复的几种方法,包括使用exp/imp,DBMS_REPAIR,Rman,bbed等方法。

在恢复前使用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

【编辑推荐】

  1. Oracle数据块原理深入剖析
  2. Oracle数据库的备份及恢复策略研究
  3. 实战Oracle数据库备份与恢复
责任编辑:yangsai 来源: 博客园
相关推荐

2010-04-13 15:35:12

Oracle处理损坏数

2019-06-12 08:57:43

Oracle数据库恢复

2011-08-29 17:00:47

Oracle数据库RM表空间数据块介质

2009-11-16 17:41:46

Oracle数据块

2009-03-26 10:33:34

Oracle数据块数据库

2009-03-06 16:48:23

数据块原理Oracle

2010-11-30 13:37:02

数据库压缩

2009-11-17 17:11:32

Oracle空闲数据块

2009-06-30 10:40:28

Linux

2009-07-02 19:07:25

Linux

2017-04-19 11:15:01

Oracle数据库备份恢复

2011-05-26 09:36:07

Oracle数据库Redo故障

2011-02-28 13:31:17

Oracle数据库

2009-11-20 13:29:59

Oracle数据库恢复

2010-04-28 17:49:41

Oracle数据字典

2011-03-04 14:59:16

Raidoracle数据库

2011-08-29 16:41:14

OracleRMAN恢复数据文件的恢复

2017-05-14 15:45:55

Linux恢复Ubuntu

2021-12-06 08:31:18

Oracle数据库后端开发

2011-07-28 15:16:23

Oracle数据库联机日志spfile
点赞
收藏

51CTO技术栈公众号