名詞解釋:
顧名思義,完全恢復就是指數據沒有丟失的恢復了。不完全恢復是指恢復后有部分數據丟失。它們是數據庫的兩種恢復方式。
完全恢復:利用重做日志或增量備份將數據塊恢復到最接近當前時間的時間點。之所以叫做完整恢復是由於
Oracle應用了歸檔日志和聯機重做日志中所有的修改。
不完全恢復:利用備份產生一個非當前版本的數據庫。換句話說,
恢復過程中不會應用備份產生后生成的所有的重做日志。
通常在下列情況下生成整個數據庫的不完整恢復
● 介質失敗損壞了幾個或全部的聯機重做日志文件;
● 用戶操作造成的數據丟失,比如,用戶誤刪除了一張表;
● 由於個別歸檔日志文件的丟失無法進行完整的恢復;
● 丟失了當前的控制文件,必須使用備份的控制文件打開數據庫。
為了執行不完整介質恢復,必須使用恢復時間點以前的備份來還原數據文件,並在恢復完成后使用RESETLOG選項打開數據庫。
resetlogs參數
在不完全恢復期間,通常需要使用resetlogs命令打開數據庫,這是因為我們要從已經建立的現有重做日志流中脫離出來。
resetlogs參數表示一個數據庫邏輯生存期的結束了另一個數據庫邏輯生存期的開始。數據庫的邏輯生存期也稱為一個對應物(incarnation)。每次使用resetlogs命令時,SCN計數器不會被重置,但是Oracle會重置其他計數器(如日志序列號),同時還會重置聯機重做日志的內容。
經過測試,當在非歸檔模式下嘗試執行完全恢復時,發出alter database open 后,RMAN會報如下錯誤:
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
但是如果加上resetlogs,就不會報錯了。而且從恢復的過程來看,期間確實使用在聯機日志文檔,也就是說它執行的是完全恢復。這說明在非歸檔模式下執行完全恢復后,打開數據庫時也要重置重做日志。其實這也很好想,非歸檔模式下,沒有歸檔的重作日志,完全恢復時使用聯機日志后,這些聯機日志文件就沒什么用了,因此Oracle就重置日志文件序列號(個人覺得:理論上來說,是可以不重置的,日志文件的序號直接在現有的日志序號上增加,但是這樣日志序號會越來越大。Oracle應該是考慮到這一點就在非歸檔模式下執行完全恢復和不完全恢復時都重置了重做日志)。
完全恢復
完全恢復很簡單,不多說,如下:
$ rman target / ##登錄rman工具,如果使用了catalog,則登陸方法rman targetsys/Oracle@lscatalogcata/cata@leo
RMAN> startup mount ##必須為mount狀態,才能restore 和 recover 數據庫
RMAN> restore database; ##復制舊數據文件覆蓋損壞的數據文件
RMAN> recover database; ##數據文件頭SCN號同步當前日志中最后一個SCN號【完全恢復】
RMAN> alter database open [resetlogs];

不完全恢復
不完全恢復有一個核心要領需要牢記:
不完全恢復影響的是整個數據庫,不能只對數據庫的一部分執行不完全恢復。不完全恢復使用的方法通常有:基於時間、SCN、日志序列、還原點或基於刪除的恢復。
$ rman target /
RMAN> startup mount
RMAN>run
2> {
3> set until time "to_date('07/01/2015 15:00:00', 'mm/dd/yyyy hh24:mi:ss')";
4> restore database;
5> recover database;
6> alter database open;
7> }
3> set until time "to_date('07/01/2015 15:00:00', 'mm/dd/yyyy hh24:mi:ss')";
4> restore database;
5> recover database;
6> alter database open;
7> }
從執行過程來看,不完全恢復就是加了一個限制條件,時間/SCN等。如上基於時間點的恢復,Oracle會查找目標恢復時間之前並與恢復時間最近的備份集。如果沒有找到可用的備份集,就會報錯。