-
一、恢復的意義
當我們使用一個資料庫時,總希望資料庫的內容是可靠的、正確的,但由於電腦系統的故障(硬體故障、網路故障、進程故障和系統故障)會影響資料庫系統的操作,影響資料庫中資料的正確性,甚至破壞資料庫,使資料庫中全部或部分資料遺失。因此當發生上述故障後,希望能重新建立一個完整的資料庫,該處理稱為資料庫復原。復原子系統是資料庫管理系統的重要組成部分。恢復處理隨所發生的故障類型所影響的結構而變化。
二、恢復的方法
IMPORT方法:
利用IMPORT,將最後一次EXPORT出來的資料檔IMPORT到新的資料庫中,這種方式可以將任何資料庫物件恢復到它被匯出時的狀態,此後的變更將無法挽回。 IMPORT的指令可以互動進行,各參數的具體意義請見ORACLE EXP/IMP參數詳解。這種方式適用於沒有採用archive 模式的環境。
安全的恢復方法:
如果資料庫運行在archive 模式下,那麼一旦資料庫損壞則可以透過冷備份(熱備份)和歸檔備份將資料庫還原到斷點狀態。
資料庫控製文件復原(假設所有控製文件均被破壞):
資料庫基於檔案系統: 利用作業系統的tar、cp等指令即可。
資料庫基於裸設備:dd if=$ORACLE_BASE/con.bak of=/dev/rdrd/drd1 seek=12
資料庫資料檔案恢復
資料及索引表空間、系統表空間的復原:
回拷相關的資料庫檔案和該資料檔案備份以來所有產生的所有邏輯日誌檔案並執行以下命令:
svrmgrl > startup mount
svrmgrl > alter database recover automatic
如果控制檔被破壞,則:svrmgrl > alter database recover using backup controfile; 依照提示輸入log檔名和redolog檔名
svrmgrl > alter database open resetlogs;
資料庫臨時檔案和回滾表空間的復原:簡單地offline drop 並重建即可。
注意:如果資料庫不執行在archive 模式下,則還原只能還原到上次備份時的狀態。 關於archive 模式的設定,以及備份的相關技術,請參閱ORACLE資料庫備份技術
三、ORACLE表空間恢復方案
(一)、戶表空間錯誤現象:
啟動資料庫時出現ORA-01157,ORA-01110或作業系統級錯
誤例如ORA-07360,在關閉資料庫(使用shutdown normal或shutdown immediate)時將導致錯誤ORA-01116,ORA-01110以及作業系統級錯誤ORA-07368
解決:
以下有兩種解決方案:
方案一、使用者的表空間可以被輕易地重建即最近導出的物件是可用的或表空間中的物件可以被輕易地重建等。在這種情況下,最簡單的方法是offline並刪除該資料文件,刪除表空間並重建表空間以及所有的物件。
svrmgrl> startup mount
svrmgrl> alter database datafile filename offline drop;
svrmgrl> alter database open;
svrmgrl> drop tablespace tablespace_name including contents;
重建表空間及所有物件。
方案二、使用者的表空間不能夠被輕易地重建在大多數情況下,重建表空間是不可能及太辛苦的工作.方法是倒備份及做介質恢復.如果您的系統運行在NOARCHIVELOG模式下,則只有遺失的數據,在online redo log中方可被恢復。
步驟如下:
1)Restore the lost datafile from a backup
2)svrmgrl> startup mount
3)svrmgrl> select v1.group#,member,sequence#,first_change# from v$log v1,v$logfile v2 where v1.group#=v2.group#;
4)如果資料庫執行在NOARCHIVELOG模式下則:svrmgrl> select file#,change# from v$recover_file;
如果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
修改init.ora檔,增加以下一行:_corrupted_rollback_segments = (<roll1>,...<rolln>)
svrmgrl> startup restrict
7) svrmgrl> drop tablespace tablespace_name including contents;
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' of='/dev/rdrd/drd1' seek=128
2.並非所有的控製文件均被破壞,用其他的控製文件啟動資料庫(六)、數據塊及其中數據的挽救現象:執行ORACLE操作時出現ORA-01578錯誤分析:ORA-1578錯誤是當ORACLE認為一個數據塊可能被破壞而發生的,通常造成該錯誤的原因有以下幾種:
I/O的硬體或firmware損壞作業系統I/O或cache故障記憶體或頁交換出錯部分資料檔案被覆蓋試圖存取未格式化區塊磁碟修復其他原因解決步驟:
查看log以及trace文件,檢查是否有其他錯誤發生定位錯誤:
sql>select * from v$datafile where file#=<F>;
sql>select owner,segment_name,segment_type from dba_extents where file_id=<F> and <B> 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) dbf' … … corrupt file id : 8=8(hex) corrupt : 8147=1fd3(hex) first rowid in the corrupt block: 0000.1fd3.0000.0008 last rowid in the corrupt block: 0000.1fd2.7fff.00088 first 48: 0000.1fd2.7fff.0008 firthis 084.
sql > create table temp as select * from bigemp where 1=2;
sql > insert into temp select * from bigemp /*+rowid(bigemp) */ where rowid >='0000.1fd4.0000.0008';
sql > insert into temp select * from bigemp where rowid <='0000.1fd2.7fff.0008';
在ORACLE 7.1以前版本,rowid range scan不存在時,可以透過索引達到以上相同的目的。
四、後記
ORACLE的備份恢復技術可以說是博大精深,我所了解的只是很少的一部分,而且還不是很透徹,希望這幾篇文章對大家能有所幫助,也歡迎大家將自己遇到的備份和恢復的問題告訴我,我將它整理起來,發表在這裡,供所有有興趣做的DBA朋友和資料管理員參考,也許您的舉手之勞會拯救一家公司!
同時,我還要提醒所有的朋友,備份是非常、非常、非常、非常、非常、非常、非常、非常、非常。 。 。重要的,有條件的話一定要採用ARCHIVE模式,否則,可能出了問題,哭都哭不出來。