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...