1. 程式人生 > >幾種oracle資料庫恢復的練習示例[轉]

幾種oracle資料庫恢復的練習示例[轉]

幾種oracle資料庫恢復的練習示例

    作為一個dba,最重要的工作莫過於保證資料庫中資料的安全,當一個數據庫down掉之後,恢復舊變成了至關重要的事情。能否成功的恢復,並不在於資料庫down掉時採取的恢復策略,要保證資料的萬無一失,一套完整的備份方案是必須的。但作為dba,還應該瞭解和掌握各種情況下應該採取哪些恢復措施,並且清楚的指導每一種恢復方式的會產生什麼樣的結果。以下是幾種常用的的備份和恢復方式的具體示例,是入門的dba必須掌握的。

例項1:歸檔的資料庫,完整的資料庫全庫備份,完整的歸檔備份,此時資料庫down掉,只留下控制檔案和日誌檔案可用。

1:安全關閉當前資料庫。(確保當前資料庫處於歸檔模式下)。 
2:copy所有的資料檔案,日誌檔案和控制檔案到一個目錄下。 
3:開啟資料庫,建新使用者user1 
create user user1 identified by aaaaaa; 
grant dba to user1; 
connect user1/aaaaaa; 
4:在user1 下建表T1,向T1中插入10000條資料。 
Begin 
For I in 1..100000 loop 
Insert into t1 values(i); 
End loop; 
Commit; 
End; 

5:切換幾次日誌,使所有日誌都已經歸檔。 
Alter system switch log file; 
6:正常關閉資料庫。Shutdown immediate; 
7:恢復: 
把當前資料庫所有檔案移動到一個臨時資料夾裡,模擬資料庫損壞。 
8:COPY最初複製的資料庫的所有檔案,但控制檔案和日誌檔案要使用目前資料庫的。 
9:啟動資料庫 startup 
mount 後會提示SYSTEM表空間需要恢復。並給出恢復使用的歸檔日誌文件。 
確定歸檔日誌位置正確後,輸入auto. 
ORACLE將一個一個的應用歸檔文件。直至提示完全恢復成功。 
10:開啟資料庫 alter database open; 
11:檢視user1使用者及t1表中是否有剛才插入的10000條記錄。 
至此,整個使用歸檔日誌對完整的資料庫冷備份進行完全恢復的模擬成功完成。


例項2:上面的例子,並且線上日誌online redo也丟失,在這種情況下,只能做不完全恢復。前8步同上。

9:startup mount; 
10:步完全恢復: 
recover database until cance; 
o mount 後會提示SYSTEM表空間需要恢復。並給出恢復使用的歸檔日誌文件。 
確定歸檔日誌位置正確後,回車,一個個應用歸檔日誌,直至最後提示的歸檔日誌用完後下一個歸檔日誌時輸入cancel. 
Oracle 提示: 
Log applied.
ORA-00279: change 84852341 generated at 09/24/2003 12:16:41 needed for thread 1
ORA-00289: suggestion : D:\ORACLE\ORADATA\SAMPLE\ARCHIVE\TESTT001S01349.ARC
ORA-00280: change 84852341 for thread 1 is in sequence #1349
ORA-00278: log file 'D:\ORACLE\ORADATA\SAMPLE\ARCHIVE\TESTT001S01348.ARC' no lon
recovery
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
Media recovery cancelled.

這是需要resetlogs引數開啟資料庫。 
Alter database open resetlogs;

例項3:上面的例子也可以做基於時間的不完全恢復,但時間必須是資料已經保留在歸檔日誌中的時間及以前。 
9:startup mount; 
10:基於時間點的不完全恢復: 
recover database until time ‘2003-9-24 12:20’;

SVRMGR> recover database until time '2003-9-24 11:20';
ORA-00279: ?? 84851370 (? 09/24/2003 11:16:01 ??) ???? 1 ????
ORA-00289: ??: D:\ORACLE\ORADATA\SAMPLE\ARCHIVE\TESTT001S01324.ARC
ORA-00280: ?? 84851370 ???? 1 ???? # 1324 ???
指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}

應用的記錄。 
SVRMGR> alter database open resetlogs;

 

 

例項4:歸檔模式下單個數據檔案丟失或損壞,從冷備份中恢復的模擬練習

1:已經做了冷備份。 
2:abort方式關掉前的資料庫,模擬由於資料檔案丟失造成資料庫非正常關閉。 
3:從冷備份當中copy丟失的資料檔案。 
4:startup mount; 
5:只對這個檔案進行恢復。 
Recover datafile 'D:\ORACLE\ORADATA\SAMPLE\DR01.DBF'; 
ORA-00279: 更改 84851719 (在 09/24/2003 12:15:51 生成) 對於執行緒 1 是必需的 
ORA-00289: 建議: D:\ORACLE\ORADATA\SAMPLE\ARCHIVE\TESTT001S01330.ARC 
ORA-00280: 更改 84851719 對於執行緒 1 是按序列 # 1330 進行的 
ORA-00278: 此恢復不再需要日誌檔案 'D:\ORACLE\ORADATA\SAMPLE\ARCHIVE\TESTT001S01329.ARC' 
指定日誌: {<RET>=suggested | filename | AUTO | CANCEL} 
auto 指定為自動恢復。 
應用的記錄。

直至完成。 
ORA-00278: 此恢復不再需要日誌檔案 'D:\ORACLE\ORADATA\SAMPLE\ARCHIVE\TESTT001S01343.ARC' 
應用的記錄。 
完成介質的恢復。 
6:開啟資料庫 
alter database open;

另一種方法: 
1:startup mount; 
2:alter database datafile 'D:\ORACLE\ORADATA\SAMPLE\DR01.DBF' offline; 
3:alter database open; 
4:recover datafile 'D:\ORACLE\ORADATA\SAMPLE\DR01.DBF';; 
5:alter database datafile 'D:\ORACLE\ORADATA\SAMPLE\DR01.DBF' online;

 

例項5:歸檔模式下熱備份的恢復模擬練習

1:對某個表空間進行熱備份. 
Ater tablespace user begin backup 
2:在os下把USER表空間對應的檔案複製到備份的目錄下。 
3:結束熱備。 
Alter tablespace user end backup. 
4:shutdown abort; 
5:刪除該表空間的資料檔案。 
6:startup; 
7:提示檔案不存在。 
8:還原熱備的檔案,令該檔案離線。 
Alter database datafile ‘88888888’ offline; 
9:開啟資料庫。 
10:恢復該檔案。 
Recover databfile ‘88888888’; 
11:alter database datafile online.

也可以對所有的表空間進行熱備,刪除資料庫所有檔案,還原熱備檔案。利用歸檔日誌進行恢復,方法同上。 
注:一定要保留熱備之後的所有歸檔日誌,聯機日誌和控制檔案,如果聯機日誌丟失(指狀態為active或者current的日誌檔案),只能進行不完全恢復。方法是按照提示輸入日誌檔案,知道最後一個沒有歸檔的日誌檔案時CANCEL掉就可以了。

一點心得: 
在資料庫歸檔模式下,即使是資料庫非正常DOWN掉,通過歸檔日誌和聯機日誌都可以進行完全恢復。可是如果某個狀態為ACTIVE或者CURRENT的日誌檔案丟失或者損壞,ORACLE肯定不能完整的開啟,即使使用 
recover database until cancel時,也基本上會報: 
ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 將出現如下錯誤 
ORA-01194: 檔案1需要更多的恢復來保持一致性 
ORA-01110: 資料檔案 1: 'D:\ORACLE\ORADATA\SAMPLE\SYSTEM01.DBF' 
這種情況下由於資料庫不能恢復到一致的狀態, 
一種方法: 
在資料庫中加入: 
_allow_resetlogs_corruption=true 
讓ORACLE不驗證資料一致性的情況下強行開啟資料庫。 
然後EXPORT出資料,重建資料庫。 
或者: 
把以前的的資料檔案拿來,做不完全恢復,一直恢復到提示使用丟失的聯機日誌序列號時時打入cancel 
recover database until cancel; 
然後使用resetlogs的選項開啟資料庫 
alter database open resetlogs; 
所以在歸檔模式下當前資料庫的控制檔案和聯機日誌檔案在恢復時候至關重要: 
其中控制檔案用來對舊資料進行恢復,應用歸檔日誌。 
而聯機日誌則可以保證資料庫恢復到發生事故時的狀態,算是完全恢復。 
如果沒歸檔的聯機日誌丟失(狀態為ACTIVE或者CURRENT),則只能使用歸檔日誌恢復到最後一個歸檔日誌的地方,是不完全恢復。