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

ORACLE數據庫恢復技術

編輯:Oracle數據庫基礎
一、恢復的意義

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

二、恢復的方法

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) 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;
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模式,否則,可能出了問題,哭都哭不出來。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved