RMAN备份恢复之BLOCKRECOVER

来源:互联网 发布:apache编译调试选项 编辑:程序博客网 时间:2024/05/01 06:03


转自:http://blog.chinaunix.net/uid-21267615-id-2406083.html

RMAN提供了单独恢复个别BLOCK的功能,这种功能作为普通恢复方法的补充,对于恢复数据库中出现的坏块可以快速的进行恢复。

RMANBLOCKRECOVER是利用一个全备份作为基础在此基础中应用日志,对于需要恢复的个别BLOCK进行恢复。

 

下面演示一个BLOCKRECOVER的简单例子,首先是构造一个坏块,最简单的办法莫过于UltraEdit了。

 

SQL> SELECT COUNT(*) FROM T3;

 

COUNT(*)

----------

50272

 

SQL>SELECT DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID), DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) FROM T3 WHERE ROWNUM = 1;

 

DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)

------------------------------------ ------------------------------------

4 40

 

SQL> SHOW PARAMETER BLOCK_SIZE

 

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

db_block_size integer 16384

 

计算一下表T3在文件中的偏移地址:

 

SQL> SELECT 16*1024*40 FROM DUAL;

 

16*1024*40

----------

655360

 

SQL> SELECT TO_CHAR(655360, 'XXXXXX') FROM DUAL;

 

TO_CHAR

-------

A0000

 

UltraEdit打开RELATIVE_FNO4的数据文件,定位到地址为A0000位置,在后面修改几个值,保存后,再次查询T3表:

 

SQL> SELECT COUNT(*) FROM T3;

SELECT COUNT(*) FROM T3

* 1行出现错误:

ORA-01578: ORACLE 数据块损坏 (文件号 4,块号 40)

ORA-01110: 数据文件 4: 'E:ORACLEORADATAYTKDATAFILEO1_MF_USERS_1TDY4JMK_.DBF'

 

现在已经模拟出坏块,可以使用RMANBLOCKRECOVER进行恢复了。不过恢复的前提是拥有这个数据文件的一个全备份,并且有这个备份以来的归档日志。

 

RMAN> BLOCKRECOVER DATAFILE 4 BLOCK 40;

 

启动 blockrecover 15-6 -07分配的通道: ORA_DISK_1通道 ORA_DISK_1: sid=157 devtype=DISK

 

通道 ORA_DISK_1:正在从数据文件副本 E:ORACLEBACKUPUSERS.DBF复原块

 

正在开始介质的恢复介质恢复完成,用时: 00:00:07

 

完成 blockrecover 15-6 -07

 

通过执行上面简单的命令,已经将数据文件中的坏块进行了修复,注意RMANBLOCKRECOVER在恢复的时候是不需要将数据文件置于脱机状态的。

 

恢复完成后,最后再次查询T3表:

 

SQL> SELECT COUNT(*) FROM T3;

 

COUNT(*)

----------

50272

 

 

出自:http://yangtingkun.itpub.net/post/468/295124

 

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sopost/archive/2009/10/20/4702227.aspx

 

有个库第一次做RMAN备份,却发现有坏块,有没有什么好办法?

块恢复可以在数据文件online的时候做,没有问题

 

说来惭愧,这是个生产库,版本:9.2.0.7OSlinux as3,第一次做RMAN备份,却发现有坏块。
还好不是系统表,把有坏块的表drop后重建了,用SELECT segment_name,segment_type,extent_id,block_id, blocks
from dba_extents t
where file_id = file#
AND block# between block_id and (block_id + blocks - 1)
已经找不到任何object。但是做level0还是提示有坏块。
DB
每天有exp的备份,删除这个表空间再重新导入是可行的,但是由于生产库,不能停。想用set maxcorrupt跳过坏块,又不知道以后做restorerecover会不会有问题?网上对此讨论的帖子也很多,

 

9i之后可以只恢复坏块

恢复坏的block9i以上版本可用)

使用这种方法要求数据库版本是9.2.0以上,要求配置了Rmancatalog数据库,数据库为归档方式,并且有完整的物理备份。

步骤如下:

使用RMANBLOCKRECOVER命令

Rman>run{blockrecover datafile 5 block 11,16;}

也可以强制使用某个SCN号之前的备份,恢复数据块。

Rman>run{blockrecover datafile 5 block 11,16 restore until sequence 8505;}

Ø
通过ROWID RANGE SCAN保存数据

1)
先取得坏块中ROW ID的最小值,执行以下的语句:

SELECT dbms_rowid.rowid_create(1,<OBJ_ID>,<RFN>,<BL>,0) from DUAL;

2
)取得坏块中的ROW ID的最大值,执行以下的语句:

SELECT dbms_rowid.rowid_create(1,<OBJ_ID>,<RFN>,<BL>+1,0) from DUAL;

3
)建议一个临时表存储那些没有坏块的数据,执行以下的语句:

CREATE TABLE salvage_table AS SELECT * FROM corrupt_tab Where 1=2;

4
)保存那些不存在坏块的数据到临时表中,执行以下的语句:

INSERT INTO salvage_table SELECT /*+ ROWID(A) */ * FROM <owner.tablename> A WHERE rowid < '<low_rid>'


INSERT INTO salvage_table SELECT /*+ ROWID(A) */ * FROM <owner.tablename> A WHERE rowid >= '<hi_rid>‘;

5)
根据临时表中的数据重建表,重建表上的索引,限制。

0 0