使用blockrecover 對有壞塊的資料檔案進行恢復

531079521發表於2015-05-08
1.建立測試表
SQL> create tablespace tb1 datafile 'E:\oracle\product\10.2.0\oradata\orcl\tb101.dbf' size 5m;
表空間已建立。


SQL> create table tb1 tablespace tb1 as select * from t_t1;
表已建立。
SQL> select count(*)from tb1;
  COUNT(*)
----------
     40741
2.rman全庫備份
RMAN> backup as compressed backupset database format 'C:\oracle\%U';

啟動 backup 於 13-12月-14
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 啟動壓縮的全部資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集中的資料檔案
輸入資料檔案 fno=00001 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
輸入資料檔案 fno=00003 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
輸入資料檔案 fno=00004 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
輸入資料檔案 fno=00005 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST01.DBF
輸入資料檔案 fno=00002 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
輸入資料檔案 fno=00007 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST_UNIFORM01.DBF
輸入資料檔案 fno=00008 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS02.DBF
輸入資料檔案 fno=00009 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TB01.DBF
輸入資料檔案 fno=00011 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TB101.DBF
輸入資料檔案 fno=00010 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\MY_UNDO01.DBF
通道 ORA_DISK_1: 正在啟動段 1 於 13-12月-14
通道 ORA_DISK_1: 已完成段 1 於 13-12月-14
段控制程式碼=C:\ORACLE\06PQ2J9L_1_1 標記=TAG20141213T133756 註釋=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:55
通道 ORA_DISK_1: 啟動壓縮的全部資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集中的資料檔案
備份集中包括當前控制檔案
在備份集中包含當前的 SPFILE
通道 ORA_DISK_1: 正在啟動段 1 於 13-12月-14
通道 ORA_DISK_1: 已完成段 1 於 13-12月-14
段控制程式碼=C:\ORACLE\07PQ2JBC_1_1 標記=TAG20141213T133756 註釋=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:01
完成 backup 於 13-12月-14


3.關閉資料庫,模擬資料塊損壞
SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。

用flexhex損壞資料檔案
4.開啟資料庫
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  167772160 bytes
Fixed Size                  1247900 bytes
Variable Size             104858980 bytes
Database Buffers           58720256 bytes
Redo Buffers                2945024 bytes
資料庫裝載完畢。
資料庫已經開啟。

資料庫正常能開啟,查詢時出現塊損壞
SQL> select count(*)from tb1;
select count(*)from tb1
                    *
第 1 行出現錯誤:
ORA-01578: ORACLE 資料塊損壞 (檔案號 11, 塊號 71)
ORA-01110: 資料檔案 11: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TB101.DBF'
5.使用dbv對資料檔案做檢測
E:\oracle\product\10.2.0\oradata\orcl>dbv file=tb101.dbf blocksize=8192

DBVERIFY: Release 10.2.0.1.0 - Production on 星期六 12月 13 14:12:41 2014
Copyright (c) 1982, 2005, Oracle.  All rights reserved.

DBVERIFY - 開始驗證: FILE = tb101.dbf
頁 71 標記為損壞
Corrupt block relative dba: 0x02c00047 (file 11, block 71)
Bad check value found during dbv:
Data in bad block:
 type: 6 format: 2 rdba: 0x02c00047
 last change scn: 0x0000.00178a9c seq: 0x1 flg: 0x04
 spare1: 0x0 spare2: 0x0 spare3: 0x0
 consistency value in tail: 0x8a9c0601
 check value in block header: 0x921
 computed block checksum: 0x59

DBVERIFY - 驗證完成

檢查的頁總數: 640
處理的頁總數 (資料): 62
失敗的頁總數 (資料): 0
處理的頁總數 (索引): 0
失敗的頁總數 (索引): 0
處理的頁總數 (其它): 15
處理的總頁數 (段)  : 0
失敗的總頁數 (段)  : 0
空的頁總數: 562
標記為損壞的總頁數: 1
流入的頁總數: 0
最高塊 SCN            : 1542814 (0.1542814)

有1個塊損壞,71

6.對資料庫中的壞塊進行驗證
SQL> select * from v$database_block_corruption;
未選定行


RMAN> backup validate database;

啟動 backup 於 13-12月-14
使用目標資料庫控制檔案替代恢復目錄
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=142 devtype=DISK
通道 ORA_DISK_1: 啟動全部資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集中的資料檔案
輸入資料檔案 fno=00001 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
輸入資料檔案 fno=00003 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
輸入資料檔案 fno=00004 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
輸入資料檔案 fno=00005 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST01.DBF
輸入資料檔案 fno=00002 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
輸入資料檔案 fno=00007 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST_UNIFORM01.DBF
輸入資料檔案 fno=00008 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS02.DBF
輸入資料檔案 fno=00009 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TB01.DBF
輸入資料檔案 fno=00011 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TB101.DBF
輸入資料檔案 fno=00010 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\MY_UNDO01.DBF
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:35
通道 ORA_DISK_1: 啟動全部資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集中的資料檔案
備份集中包括當前控制檔案
在備份集中包含當前的 SPFILE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:02
完成 backup 於 13-12月-14

剛才那些壞塊都被列入到了檢視V$DATABASE_BLOCK_CORRUPTION中。
SQL> select * from v$database_block_corruption;


     FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
        11         71          1                  0 CHECKSUM
7.使用blockrecover恢復
RMAN> blockrecover datafile 11 block 71;

啟動 blockrecover 於 13-12月-14
使用通道 ORA_DISK_1


通道 ORA_DISK_1: 正在恢復塊
通道 ORA_DISK_1: 正在指定要從備份集恢復的塊
正在恢復資料檔案 00011 的塊
通道 ORA_DISK_1: 正在讀取備份段 C:\ORACLE\06PQ2J9L_1_1
通道 ORA_DISK_1: 已從備份段 1 恢復塊
段控制程式碼 = C:\ORACLE\06PQ2J9L_1_1 標記 = TAG20141213T133756
通道 ORA_DISK_1: 塊恢復完成, 用時: 00:00:04

正在開始介質的恢復
介質恢復完成, 用時: 00:00:07

完成 blockrecover 於 13-12月-14

還可以透過RMAN> blockrecover corruption list進行塊的恢復,這是在大量塊損壞時或全部塊損壞時使用,
前提是先執行RMAN>backup validate database,在V$DATABASE_BLOCK_CORRUPTION裡有對應的壞塊的列表。


8.恢復完成後,進行驗證
E:\oracle\product\10.2.0\oradata\orcl>dbv file=tb101.dbf blocksize=8192
DBVERIFY: Release 10.2.0.1.0 - Production on 星期六 12月 13 14:23:05 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.
DBVERIFY - 開始驗證: FILE = tb101.dbf

DBVERIFY - 驗證完成


檢查的頁總數: 640
處理的頁總數 (資料): 63
失敗的頁總數 (資料): 0
處理的頁總數 (索引): 0
失敗的頁總數 (索引): 0
處理的頁總數 (其它): 15
處理的總頁數 (段)  : 0
失敗的總頁數 (段)  : 0
空的頁總數: 562
標記為損壞的總頁數: 0
流入的頁總數: 0
最高塊 SCN            : 1542814 (0.1542814)


沒有顯示壞塊

SQL> select count(*)from tb1;
  COUNT(*)
----------
     40741


恢復成功

壞介質恢復優點:
?Lowers the Mean Time to Recovery (MTTR) because only blocks needing recovery are restored and only necessary corrupt blocks undergo recovery. Block media recovery minimizes redo application time and avoids I/O overhead during recovery.
?Allows affected datafiles to remain online during recovery of the blocks. Without block-level recovery, if even a single block is corrupt, then you must restore a backup of the entire datafile and apply all redo generated for that file after the backup was created.

壞介質恢復要求:
?You can only perform block media recovery with RMAN. No SQL*Plus recovery interface is available.
?You can only perform complete recovery of individual blocks. In other words, you cannot stop recovery before all redo has been applied to the block.
?You can only recover blocks marked media corrupt. The V$DATABASE_BLOCK_CORRUPTION view indicates which blocks in a file were marked corrupt since the most recent BACKUP or BACKUP ... VALIDATE command was run against the file.
?You must have a full RMAN backup. Incremental backups are not used by block media recovery. Proxy backups are also not used by block media recovery. Only full backups and archived log files are used.
?Block media recovery is able to restore blocks from parent incarnation backups and recover the corrupted blocks through a RESETLOGS.
?Blocks that are marked media corrupt are not accessible to users until recovery is complete. Any attempt to use a block undergoing media recovery results in an error message indicating that the block is media corrupt.




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28841119/viewspace-1629895/,如需轉載,請註明出處,否則將追究法律責任。

相關文章