(四)、回滾表空間
有兩種情況:
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模式,否則,可能出了問題,哭都哭不出來。