oracle 数据块损坏 Oracle 数据块损坏与恢复详解

本文主要对RMAN块级别介质恢复进行解释并举例,以帮助大家理解相应概念并灵活使用

块级别介质恢复(Block-Level Media Recovery)

注意: 此恢复无法对数据文件块头(第一个块)进行恢复。

  • 块级别介质恢复对于仅需要介质恢复很小部分数据文件块的场景来说非常好用。
  • 在Oracle 9i之前,如果单个块需要进行恢复的话,DBA需要将整个数据文件恢复出来并应用所有之后的redo记录。
  • 块级别介质恢复极大降低了从备份恢复块的时间,仅需针对坏块部分进行备份恢复和redo应用即可。
  • 在进行数据块介质恢复的过程中,由于是坏块,所以对查询和DML来说这些块是无法访问的,不过数据文件仍能保持online状态。不过,相比文件级别恢复来说这已经极大地提升了可用性。仅是正被修复的块对用户不可见而已,恢复完成后即可访问了。

RMAN命令接口

  • RMAN通过BLOCKRECOVER命令支持BMR恢复
BLOCKRECOVER bmr_block_specifier_list bmr_option_list;
bmr_block_specifier_list: bmr_block_specifier |
bmr_block_specifier_list bmr_block_specifier
bmr_block_specifier: DATAFILE datafile_specifier BLOCK block_list |
TABLESPACE tablespace_specifier DBA dba_list
CORRUPTION LIST
datafile_specifier: text_string | integer
block_list: integer |
block_list , integer
tablespace_specifier: text_string
dba_list: integer |
dba_list , integer
bmr_option_list: bmr_option |
bmr_option_list | bmr_option
bmr_option: from backupset |
from datafilecopy |
from tag text_string |
restore until time_clause |
nofileupdate |
save final blocks |
save all blocks
time_clause: TIME date_string |
SCN integer |
LOGSEQ integer THREAD integer

命令块恢复可以指定从哪个备份中进行恢复。如果用户在之前从没用过RMAN,而他们仅有的备份是直接用的镜像copy备份。
那么他们应该使用catalog datafilecopy命令先将这些文件注册到RMAN中,然后再使用blockrecover命令。 
而catalog archivelog命令也同样需要在指定并注册归档日志时使用。
在用户之前并未用过RMAN的情况下,这些步骤是非常有必要的。

% rman target /
RMAN> catalog datafilecopy '<name>';
      catalog archivelog '<name>';
See also :

相关可查文档可参考
Note 342972.1 HOW TO PERFORM BLOCK MEDIA RECOVERY (BMR) WHEN BACKUPS ARE NOT TAKEN BY RMAN

如果用户的备份或归档日志需要从磁带上进行恢复,那么就需要在进行blockrecover命令前分配好管道(channel)。
对于BMR需要的归档日志可以并行在多个管道上运行,不过所有运行的数据文件/备份集扫描和恢复会话都必须运行在同一个系统会话上。

为了可以在块修复时对备份源做选择,blockrecover在命令中支持以下命令项:

  • FROM BACKUPSET -- 从备份集中恢复块
  • FROM DATAFILECOPY -- 仅从数据文件拷贝中恢复块
  • FROM TAG -- 从打了标签的备份中恢复块 
  • RESTORE UNTIL TIME|SCN|LOGSEQ -- 限定找在某个时间点之前的备份

从Oracle 9.0.1开始,就有V$DATABASE_BLOCK_CORRUPTION这张视图来反应从最近RMAN备份时发现的坏块。

举例:

  • 如何确定需要恢复的块。
SQL> select * from mine;
select * from mine
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 5, block # 114)
ORA-01110: data file 5: '/u02/oradata/DB1/users01.dbf'
  • 使用RMAN进行备份并将检查到的坏块记录在V$DATABASE_BLOCK_CORRUPTION视图中。
RMAN> run {BACKUP VALIDATE DATABASE;}

Starting backup at 09-MAY-01
using channel ORA_DISK_1
using channel ORA_DISK_2
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00002 name=/u02/oradata/DB1/undotbs01.dbf
input datafile fno=00003 name=/u02/oradata/DB1/indx01.dbf
input datafile fno=00005 name=/u02/oradata/DB1/users01.dbf
input datafile fno=00008 name=/u02/oradata/DB1/repcat01.dbf
input datafile fno=00004 name=/u02/oradata/DB1/tools01.dbf
channel ORA_DISK_2: starting full datafile backupset
channel ORA_DISK_2: specifying datafile(s) in backupset
including current controlfile in backupset
input datafile fno=00001 name=/u02/oradata/DB1/system01.dbf
input datafile fno=00006 name=/u02/oradata/DB1/joanes/joanes_1.dbf
input datafile fno=00007 name=/u02/oradata/DB1/joanes/joanes_test_1.dbf
channel ORA_DISK_1: backup set complete, elapsed time: 00:01:28
channel ORA_DISK_2: backup set complete, elapsed time: 00:01:54
Finished backup at 09-MAY-01
  • 查看反馈结果:
SQL> select * from V$backup_corruption;

RECID STAMP SET_STAMP SET_COUNT PIECE# FILE# BLOCK#
---------- ---------- ---------- ---------- ---------- ---------- ----------
BLOCKS CORRUPTION_CHANGE# MAR
---------- ------------------ ---
1 429201733 429201725 8 1 5 114
1 0 YES
  • 然后通过坏块清单(corruption list - v$backup_corruption)来进行块级别恢复。

使用指定文件和块位置来进行指定恢复:

$ rman catalog rman/rman@DB2 target / log=rman1.log
RMAN> run {blockrecover datafile 5 block 114;}
RMAN> exit
Recovery Manager: Release 9.0.0.0.0 - Beta
(c) Copyright 2000 Oracle Corporation. All rights reserved.

connected to target database: DB1 (DBID=1021434286)
connected to recovery catalog database

RMAN>
Starting blockrecover at 08-MAY-01
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=8 devtype=DISK
allocated channel: ORA_DISK_2
channel ORA_DISK_2: sid=7 devtype=DISK 
channel ORA_DISK_1: restoring block(s)
channel ORA_DISK_1: specifying block(s) to restore from backup set
restoring blocks of datafile 00005
channel ORA_DISK_1: restored block(s) from backup piece 1
piece handle=/u02/oradata/DB1/joanes/04cp9jk9_1_1 tag=null params=NULL
channel ORA_DISK_1: block restore complete
channel ORA_DISK_1: block restore complete

starting media recovery
media recovery complete

Finished blockrecover at 08-MAY-01

你也可以使用Data Recovery Advisor (DRA)来进行推荐恢复:

RMAN> list failure;
List of Database Failures
=========================

Failure ID Priority Status    Time Detected Summary
---------- -------- --------- ------------- -------
441        HIGH     OPEN      20-SEP-13     Datafile 4: '/u01/V112_oradata/users01.dbf' contains one or more corrupt blocks

RMAN> advise failure;
List of Database Failures
=========================

Failure ID Priority Status    Time Detected Summary
---------- -------- --------- ------------- -------
441        HIGH     OPEN      20-SEP-13     Datafile 4: '/u01/V112_oradata/users01.dbf' contains one or more corrupt blocks

analyzing automatic repair options; this may take some time
using channel ORA_DISK_1
analyzing automatic repair options complete

Mandatory Manual Actions
========================
no manual actions available

Optional Manual Actions
=======================
no manual actions available

Automated Repair Options
========================
Option Repair Description
------ ------------------
1      Perform block media recovery of block 520 in file 4  
  Strategy: The repair includes complete media recovery with no data loss
  Repair script: /u02/app/oracle/diag/rdbms/v112/V112/hm/reco_4024241654.hm

RMAN> repair failure preview;
Strategy: The repair includes complete media recovery with no data loss
Repair script: /u02/app/oracle/diag/rdbms/v112/V112/hm/reco_4024241654.hm

contents of repair script:
   # block media recovery
   recover datafile 4 block 520;

RMAN> repair failure noprompt;
Strategy: The repair includes complete media recovery with no data loss
Repair script: /u02/app/oracle/diag/rdbms/v112/V112/hm/reco_4024241654.hm

contents of repair script:
   # block media recovery
   recover datafile 4 block 520;

executing repair script

Starting recover at 20-SEP-13
using channel ORA_DISK_1

channel ORA_DISK_1: restoring block(s)
channel ORA_DISK_1: specifying block(s) to restore from backup set
restoring blocks of datafile 00004
channel ORA_DISK_1: reading from backup piece /u01/temp/flash_areas/V112/V112/backupset/2013_09_20/o1_mf_nnndf_TAG20130920T092224_93rm0khr_.bkp
channel ORA_DISK_1: piece handle=/u01/temp/flash_areas/V112/V112/backupset/2013_09_20/o1_mf_nnndf_TAG20130920T092224_93rm0khr_.bkp tag=TAG20130920T092224
channel ORA_DISK_1: restored block(s) from backup piece 1
channel ORA_DISK_1: block restore complete, elapsed time: 00:00:01

starting media recovery

archived log for thread 1 with sequence 187 is already on disk as file /u01/temp/flash_areas/V112/V112/archivelog/2013_09_20/o1_mf_1_187_93rmnqwg_.arc
archived log for thread 1 with sequence 188 is already on disk as file /u01/temp/flash_areas/V112/V112/archivelog/2013_09_20/o1_mf_1_188_93rmq47g_.arc
archived log for thread 1 with sequence 189 is already on disk as file /u01/temp/flash_areas/V112/V112/archivelog/2013_09_20/o1_mf_1_189_93rn7994_.arc
archived log for thread 1 with sequence 190 is already on disk as file /u01/temp/flash_areas/V112/V112/archivelog/2013_09_20/o1_mf_1_190_93rnymmf_.arc
media recovery complete, elapsed time: 00:00:03
Finished recover at 20-SEP-13
repair failure complete

使用坏块清单进行恢复 :

RMAN> run {blockrecover corruption list;} 
Starting blockrecover at 08-MAY-01
using channel ORA_DISK_1
using channel ORA_DISK_2
channel ORA_DISK_1: restoring block(s)
channel ORA_DISK_1: specifying block(s) to restore from backup set
restoring blocks of datafile 00005
channel ORA_DISK_1: restored block(s) from backup piece 1
piece handle=/u02/oradata/DB1/joanes/08cpa69t_1_1 tag=null params=NULL
channel ORA_DISK_1: block restore complete
channel ORA_DISK_1: restoring block(s)
channel ORA_DISK_1: specifying block(s) to restore from backup set
restoring blocks of datafile 00005
channel ORA_DISK_1: restored block(s) from backup piece 1
piece handle=/u02/oradata/DB1/joanes/04cp9jk9_1_1 tag=null params=NULL
channel ORA_DISK_1: block restore complete

starting media recovery
media recovery complete

Finished blockrecover at 08-MAY-01

 
Oracle 11.2 RMAN块恢复语法

在11.2版本你可以使用RMAN进行:

1) 对存在物理和逻辑坏块的所有数据库文件和归档日志进行查验:

BACKUP VALIDATE CHECK LOGICAL DATABASE ARCHIVELOG ALL;

2) 单独检查某些数据库块,可以使用以下命令方式,如:

VALIDATE DATAFILE 4 BLOCK 10 TO 13;

3) 查验数据集:

VALIDATE BACKUPSET 3;

可以通过指定备份集主键来进行指定查验,LIST BACKUP可以查到备份集主键编号。


使用以下RMAN命令来恢复讹误的块:
1) 通过v$database_block_corruption来恢复所有报告错误的块

RMAN> RECOVER CORRUPTION LIST;

2) 恢复单个块

 RMAN> RECOVER DATAFILE 1 BLOCK 233, 235 DATAFILE 2 BLOCK 100 TO 200;


注意限制:
不能用于数据文件块头(block 1)恢复!

# 举例使用blockrecover进行块头恢复:

 在本例中数据文件头(1号块)存在物理损坏.
 使用rman块恢复命令并不会报不发恢复的错误,但是在alert log中会有记录:

RMAN> blockrecover datafile 7 block 1;

Starting recover at 19-MAR-13
using channel ORA_DISK_1

starting media recovery
media recovery complete, elapsed time: 00:00:00

Finished recover at 19-MAR-13

# 可见命令执行并未报错,但是alert.log可以看到问题:

...
Corrupt block relative dba: 0x01c00001 (file 7, block 1)
Bad header found during kcvxfh v10
Data in bad block:
 type: 99 format: 7 rdba: 0x0a747075
 last change scn: 0x0000.00000000 seq: 0x1 flg: 0x04
 spare1: 0x72 spare2: 0x72 spare3: 0x0
 consistency value in tail: 0x00000b01
 check value in block header: 0xf5c4
 computed block checksum: 0xc4da
Reading datafile '/emea/bde/64bit/app/oracle/oradata/EMB11203/tc.dbf' for corruption at rdba: 0x01c00001 (file 7, block 1)
Reread (file 7, block 1) found same corrupt data (no logical check)
Tue Mar 19 13:31:46 2013
alter database recover datafile list clear
Completed: alter database recover datafile list clear


 

猜你喜欢

转载自blog.csdn.net/liu_maclean/article/details/81659893