RMAN备份恢复之BLOCKRECOVER

本文详细介绍了如何使用RMAN的BLOCKRECOVER命令来恢复Oracle数据库中的坏块。通过模拟创建坏块,然后使用BLOCKRECOVER进行恢复,展示了该功能在处理个别损坏数据块时的实用性。在恢复过程中,不需要将数据文件脱机,使得恢复过程更加便捷。
RMAN备份恢复之BLOCKRECOVER

  RMAN提供了单独恢复个别BLOCK的功能,这种功能作为普通恢复方法的补充,对于恢复数据库中出现的坏块可以快速的进行恢复。
  RMAN的BLOCKRECOVER是利用一个全备份作为基础,在此基础中应用日志,对于需要恢复的个别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_FNO为4的数据文件,定位到地址为A0000位置,在后面修改几个值,保存后,再次查询T3表:

  SQL> SELECT COUNT(*) FROM T3;

  SELECT COUNT(*) FROM T3

  *第 1 行出现错误:
  ORA-01578: ORACLE 数据块损坏 (文件号 4, 块号 40)
  ORA-01110: 数据文件 4: 'E:ORACLEORADATAYTKDATAFILE O1_MF_USERS_1TDY4JMK_.DBF'

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

  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

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

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

  SQL> SELECT COUNT(*) FROM T3;

  COUNT(*)
   ----------
  50272

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

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

  说来惭愧,这是个生产库,版本:9.2.0.7,OS:linux 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 跳过坏块,又不知道以后做restore和recover会不会有问题?网上对此讨论的帖子也很多

  9i之后可以只恢复坏块

  恢复坏的block(9i以上版本可用)

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

  步骤如下:

  使用RMAN的BLOCKRECOVER命令 :

  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,,,,0) from DUAL;

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

  SELECT dbms_rowid.rowid_create(1,,, 1,0) from DUAL;

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

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

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

  INSERT INTO salvage_table SELECT * FROM A WHERE rowid < '';

  INSERT INTO salvage_table SELECT * FROM A WHERE rowid >= '‘;

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

转自:http://oracle.chinaitlab.com/backup/805958_2.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值