程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle數據塊損壞恢復總結

Oracle數據塊損壞恢復總結

編輯: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的詳細用法這裡不做具體介紹。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved