ORACLE資料庫恢復技術

wuhuizhong發表於2007-07-25

一、恢復的意義
  當我們使用一個資料庫時,總希望資料庫的內容是可靠的、正確的,但由於計算機系統的
故障(硬體故障、網路故障、程式故障和系統故障)影響資料庫系統的操作,影響資料庫中數
據的正確性,甚至破壞資料庫,使資料庫中全部或部分資料丟失。因此當發生上述故障後,希
望能重新建立一個完整的資料庫,該處理稱為資料庫恢復。恢復子系統是資料庫管理系統的一
個重要組成部分。恢復處理隨所發生的故障型別所影響的結構而變化。

[@more@]二、恢復的方法
  IMPORT方法:
  利用IMPORT,將最後一次EXPORT出來的資料檔案IMPORT到新的資料庫中,這種方式可以將
任何資料庫物件恢復到它被匯出時的狀態,此後的變化將無法挽回。IMPORT的命令可以互動式
進行,各引數的具體含義見ORACLE EXP/IMP引數詳解。這種方式適用於沒有采用archive 模式
  安全的恢復方法:
  如果資料庫執行在archive 模式下,那麼一旦資料庫損壞則可以透過冷備份(熱備份)和歸
  資料庫控制檔案恢復(假設所有控制檔案均被破壞):
  資料庫基於檔案系統: 利用作業系統的tar、cp等命令即可。
  資料庫基於裸裝置:dd if=$ORACLE_BASE/con.bak of=/dev/rdrd/drd1 seek=12
  資料庫資料檔案恢復
  資料及索引表空間、系統表空間的恢復:
  回拷相關的資料庫檔案和該資料檔案備份以來所有生成的所有邏輯日誌檔案並執行如下命
令:

  資料庫臨時檔案和回滾表空間的恢復:簡單地offline drop 並重建即可
  注意:如果資料庫不執行在archive 模式下,則恢復只能恢復到上次備份時的狀態。 關
於archive 模式的設定,以及備份的相關技術,參見ORACLE資料庫備份技術
  三、ORACLE表空間恢復方案
  (一)、戶表空間
  錯誤現象:
  在啟動資料庫時出現ORA-01157,ORA-01110或作業系統級錯誤例如ORA-07360,在關閉數
據庫(使用shutdown normal或shutdown immediate) 時將導致錯誤ORA-01116,ORA-01110以
  解決:
  以下有兩種解決方案:
  方案一、使用者的表空間可以被輕易地重建
  即最近匯出的物件是可用的或表空間中的物件可以被輕易地重建等。在這種情況下,最簡
單的方法是offline並刪除該資料檔案,刪除表空間並重建表空間以及所有的物件。

  重建表空間及所有物件。
  方案二、使用者的表空間不能夠被輕易地重建
  在大多數情況下,重建表空間是不可能及太辛苦的工作.方法是倒備份及做介質恢復.如果
您的系統執行在NOARCHIVELOG模式下,則只有丟失的資料,在online redo log中方可被恢復
  步驟如下:
  1)Restore the lost datafile from a backup

  如果 CHANGE# 大於最小的FIRST_CHANGE#則資料檔案可以被恢復。
  如果 CHANGE# 小於最小的FIRST_CHANGE#則資料檔案不可恢復。恢復最近一次的全備份或
採用方案一。
  5)svrmgrl> recover datafile filename;
  6)確認恢復成功   7)svrmgrl> alter database open resetlogs;
  只讀表空間無需做介質恢復,只要將備份恢復即可。唯一的例外是:
  表空間在最後一次備份後被改為read-write 模式
  表空間在最後一次備份後被改為read-only 模式
  在這種情況下,均需進行介質恢復。
  (二)、臨時表空間
  臨時表空間並不包含真正的資料,恢復的方法是刪除臨時表空間並重建即可。
  (三)、系統表空間
  如果備份不可用,則只能採用重建資料庫的方法
  (四)、回滾表空間
  有兩種情況:
  1、資料庫已經完全關閉(使用shutdown immediate或shutdown命令)
  1) 確認資料庫完全關閉
  2) 修改init.ora檔案,註釋"rollback-segment"   3) svrmgrl> startup restrict mount
  4) svrmgrl> alter database datafile filename offline drop;
  5) svrmgrl> alter database open;
  基於出現的結果:"statement processed" 轉(7);"ORA-00604,ORA-00376,ORA-01110"轉
(6)
  6) svrmgrl> shutdown immediate
  8) 重建表空間及回滾段   9) svrmgrl> alter system disable restricted session;
  10) 修改init.ora檔案
  2、資料庫未完全關閉(資料庫崩潰或使用shutdown abort命令關閉資料庫)
  1) 恢復備份   2) svrmgrl> startup mount
  3) svrmgrl> select file#,name,status from v$datafile;
  svrmgrl> alter database datafile filename online;
  4) svrmgrl> select v1.group#,member,sequence#,first_change# from v$log v1,v$logfile v2 where v1.group#=v2.group#;
  5) svrmgrl> select file#,change# from v$recover_file; #參見方案2-4
  6) svrmgrl> recover datafile filename;
  7) svrmgrl> alter database open;
  3、資料庫處於開啟狀態
  1) 刪除回滾段和表空間
  2) 重建表空間和回滾段
  (五)、控制檔案恢復
  1.所有的控制檔案均被破壞
  將備份的控制檔案複製至原目錄下,對於RAW DEVICE(裸裝置),則:dd if='con.bak'
  2.並非所有的控制檔案均被破壞,用其他的控制檔案啟動資料庫
  (六)、資料塊及其中資料的挽救
  現象:執行ORACLE操作時出現ORA-01578錯誤
  分析:ORA-1578錯誤是當ORACLE認為一個資料塊可能被破壞而發生的,通常引起該錯誤的
  I/O的硬體或firmware損壞
  作業系統I/O或cache故障
  記憶體或頁交換出錯
  部分資料檔案被覆蓋
  試圖訪問未格式化塊
  磁碟修復
  其他原因
  解決步驟:
  檢視log以及trace檔案,檢查是否有其他錯誤發生
  定位錯誤:   sql>select * from v$datafile where file#=;
  sql>select owner,segment_name,segment_type from dba_extents where file_id= and between block_id and block_id+blocks-1;
  基於返回的segment_type:
  segment型別為temporary或cache或無返回值,檢查SQL語句是否正確。
  segment型別為rollback segment,則資料塊需要恢復。
  segment型別為index,檢查其所在的表。重建索引即可。   sql> select owner,table_name from dba_tables where cluster_name = name_of_segment
  仍然出現1578錯誤,資料庫需要恢復。
  segment型別為表,拯救表中的資料。
  分析一個實體是否有永久性資料破壞   sql> analyze table table.name validate structure cascade;
  sql> analyze table clustername validate structure cascade;
  硬體錯誤的恢復
  資料庫執行在ARCHIVE模式下
  OFFLINE相應的資料檔案
  複製備份的資料檔案
  rename the datafile to new location
  recover the datafile using archive log
  online資料檔案
  資料庫執行在非ARCHIVE模式下
  OFFLINE相應資料檔案
  複製備份的資料檔案,rename the datafile and online it
  拯救表中資料   例如:sql>select * from bigemp;
  ERROR:ORA-01578: ORACLE DATA block corrupted (file#8,block#8147) ORA-00110:
data file 8: ‘/oracle/usr714.dbf’ … … corrupt file id : 8=8(hex) corrupt
block id : 8147=1fd3(hex) first rowid in the corrupt block: 0000.1fd3.0000.0008
last rowid in the corrupt block: 0000.1fd2.7fff.0008 first rowid affer this
block: 0000.1fd4.0000.0008
  sql > create table temp as select * from bigemp where 1=2;
  在ORACLE 7.1以前版本,rowid range scan不存在時,可以透過索引達到以上相同的目的
  四、後記
  ORACLE的備份恢復技術可以說是博大精深,我所瞭解的只是很少的一部分,而且還不是很
透徹,希望這幾篇文章對大家能有所幫助,也歡迎大家將自己遇到的備份和恢復的問題告訴我
,我將它整理起來,發表在這裡,供所有有興趣做的DBA朋友和資料管理員參考,也許您的舉
  同時,我還要提醒所有的朋友,備份是非常、非常、非常、非常、非常、非常、非常、非
常、非常。。。重要的,有條件的話一定要採用ARCHIVE模式
.

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

相關文章