天天看點

Oracle資料塊損壞恢複總結

Oracle資料塊損壞恢複總結

在恢複前使用DBV指令檢查資料檔案是否存在壞塊

dbv file=d:\oracle\oradata\mydb\RONLY.DBF blocksize=8192

檢視資料壞塊所在資料檔案号及塊号可以對表進行一次全表掃描,如:

select count(*) from tablename;

1、    沒有備份的情況下:

1.1、使用exp/imp恢複

  在這種情況下肯定會造成資料的丢失,在這種情況下應采取将資料導出然後重建表再進行導入的方法,來盡量恢複損壞資料塊中的資料,但是在有壞塊的情況下是不允許導出的,如下指令:

  Exp test/test file=t.dmp tables=t;

  導出指令在執行中會報ORA-01578錯誤,在這錯誤提示中會提示那個檔案号的檔案以及這個檔案中的哪個塊被損壞,如:ORA—01578:ORACLE 資料塊損壞(檔案号 4,塊号 35)

  針對以上的提示首先查詢那些對象被損壞:

  Select tablespace_name,segment_type,owner,segment_name From dba_extents Where file_id=4 and 35 between block_id and block_id+blocks-1;

如果被損壞的塊是索引,通常可以通過索引重建來解決,如果損壞的是資料(segment_type為table),那麼通過設定如下内部事件使得Exp操作跳過壞塊。

Alter session set events=’10231 trace name context forever,level 10’;

然後重新執行導出指令,導出相關的表,然後執行Drop Table指令删除相關表,之後重建表最後導入資料。

1.2、使用DBMS_REPAIR恢複

用DBMS_REPAIR當然也會丢失資料。這裡不做詳細的介紹,有興趣的可以檢視oracle的線上文檔

2、使用Rman進行恢複:

  首先要存在Rman的最新備份集,然後執行如下指令:

RMAN>backup validate datafile 4;檢查4号資料檔案是否存在壞塊

執行查詢:select * from v$database_block_corruption where file#=4;

如果4号檔案存在壞塊的話,那麼将在結果集中有所顯示,會顯示損壞的塊号,根據顯示結果執行如下指令進行恢複:

RMAN>blockrecover datafile 4 block 35 from backupset;

該指令執行後即可恢複壞塊,并且不會造成資料丢失,但是要求資料庫必須要運作在歸檔模式下,否則RMAN無法發揮作用,而且通過RMAN做過最新的資料庫備份

3、使用bbed恢複

使用bbed恢複時必須有資料檔案的拷貝。

bbed就是英文block browse edit的縮寫,用來直接檢視和修改資料檔案資料的一個工具。

在windows和linux上面都有

但在linux下需要編譯:

然後把$ORACLE_HOME/rdbms/lib加到環境變量的PATH裡面,就可以直接在指令中bbed了。

BBED的預設密碼為blockedit,For Oracle Internal Use only 請謹慎使用Oracle不做技術支援。

[oracle@test oracle]$ cd $ORACLE_HOME/rdbms/lib

[oracle@test lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

進入bbed後,可以使用help檢視幫助

BBED> help

bbed的詳細用法這裡不做具體介紹。

詳細用法可以參考:

<a href="http://www.sosdb.com/jdul/dispbbs.asp?boardID=1&amp;ID=237" target="_blank">http://www.sosdb.com/jdul/dispbbs.asp?boardID=1&amp;ID=237</a>