天天看點

ORACLE的不完全恢複概念,完全恢複與不完全恢複概念

完全恢複:利用重做日志或增量備份将資料塊恢複到最接近目前時間的時間點。之是以叫做完整恢複是由于

Oracle應用了歸檔日志和聯機重做日志中所有的修改

不完全恢複:利用備份産生一個非目前版本的資料庫。換句話說,

恢複過程中不會應用備份産生後生成的所有的重做日志

通常在下列情況下生成整個資料庫的不完整恢複

● 媒體失敗損壞了幾個或全部的聯機重做日志檔案;

● 使用者操作造成的資料丢失,比如,使用者誤删除了一張表;

● 由于個别歸檔日志檔案的丢失無法進行完整的恢複;

● 丢失了目前的控制檔案,必須使用備份的控制檔案打開資料庫。

為了執行不完整媒體恢複,必須使用恢複時間點以前的備份來還原資料檔案,并在恢複完成後使用RESETLOG選項打開資料庫。

resetlogs參數

在不完全恢複期間,通常需要使用resetlogs指令打開資料庫,這是因為我們要從已經建立的現有重做日志流中脫離出來。

resetlogs參數表示一個資料庫邏輯生存期的結束了另一個資料庫邏輯生存期的開始

。資料庫的邏輯生存期也稱為一個對應物(incarnation)。每次使用resetlogs指令時,SCN計數器不會被重置,但是Oracle會重置其他計數器(如日志序列号),同時還會重置聯機重做日志的内容。

經過測試,當在非歸檔模式下嘗試執行完全恢複時,發出alter database open 後,RMAN會報如下錯誤:

ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

但是如果加上resetlogs,就不會報錯了。而且從恢複的過程來看,期間确實使用在聯機日志文檔,也就是說它執行的是完全恢複。這說明在非歸檔模式下執行完全恢複後,打開資料庫時也要重置重做日志。其實這也很好想,非歸檔模式下,沒有歸檔的重作日志,完全恢複時使用聯機日志後,這些聯機日志檔案就沒什麼用了,是以Oracle就重置日志檔案序列号(個人覺得:理論上來說,是可以不重置的,日志檔案的序号直接在現有的日志序号上增加,但是這樣日志序号會越來越大。Oracle應該是考慮到這一點就在非歸檔模式下執行完全恢複和不完全恢複時都重置了重做日志)。

完全恢複

完全恢複很簡單,不多說,如下:

$ rman target /                       ##登入rman工具,如果使用了catalog,則登陸方法rman targetsys/[email protected]/[email protected]

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> }

從執行過程來看,不完全恢複就是加了一個限制條件,時間/SCN等。如上基于時間點的恢複,Oracle會查找目标恢複時間之前并與恢複時間最近的備份集。如果沒有找到可用的備份集,就會報錯。