RMAN備份恢復之BLOCKRECOVER

2021-06-07 01:48:20 字數 2682 閱讀 7237

rman提供了單獨恢復個別block的功能,這種功能作為普通恢復方法的補充,對於恢復資料庫中出現的壞塊可以快速的進行恢復。

rman的blockrecover是利用乙個全備份作為基礎,在此基礎中應用日誌,對於需要恢復的個別block進行恢復。

下面演示乙個blockrecover的簡單例子,首先是構造乙個壞塊,最簡單的辦法莫過於ultraedit了。

sql> select count(*) from t3;

count(*)

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

sql> select 16*1024*40 from dual;

16*1024*40

sql> select to_char(655360, '******') from dual;

to_char

a0000

sql> select count(*) from t3;

select count(*) from t3

*第 1 行出現錯誤:

ora-01578: oracle 資料塊損壞 (檔案號 4, 塊號 40)

ora-01110: 資料檔案 4: 'e:oracleoradataytkdatafileo1_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

通過執行上面簡單的命令,已經將資料檔案中的壞塊進行了修復,注意rman的blockrecover在恢復的時候是不需要將資料檔案置於離線狀態的。

恢復完成後,最後再次查詢t3表:

sql> select count(*) from t3;

count(*)

有個庫第一次做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

也可以強制使用某個scn號之前的備份,恢復資料塊。

rman>run

通過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 /*+ rowid(a) */ * from a where rowid < '';

insert into salvage_table select /*+ rowid(a) */ * from a where rowid >= '『;

5) 根據臨時表中的資料重建表,重建表上的索引,限制。

RMAN備份恢復Oracle

一 備份與恢復概述 1 需要備份的原因 現實工作中有很多情況都可能造成資料丟失,造成資料丟失的主要因素如下。n 介質故障 磁碟損壞 磁頭碰撞,瞬時強磁場干擾 n 使用者的錯誤操作 n 伺服器的徹底崩潰 n 計算機病毒 n 不可預料的因素 自然災害 電源故障 盜竊 上面是一些可能的故障原因,根據原因可...

RMAN備份及恢復

rman備份 1 spfile和controlfile的自動備份 當configure controlfile autobackup off時,僅當備份system01.dbf時才會自動備份controlfile和spfile 當configure controlfile autobackup on...

RMAN的備份與恢復 SPFILE恢復

1 方法最簡單,但是已經背離了rman恢復學習的初衷 但是這種方面需要乙個前提就是你的pfile檔案還存在 c sharp view plain copy print?create spfile c oracle product 10.2.0 db 1 database spfileorcl.ora...