我們知道,對歸檔下的資料庫做RMAN全備,當資料庫挂掉之後,執行完全恢複時,可以将資料庫将恢複到完全最新的狀态,包括至目前時間所做的所有已送出的資料修改,保證不會丢失資料。但是執行不完全恢複時,資料庫會恢複到過去的某個時間點,這意味着會缺失一些事務處理,即恢複目标時間和目前時間之間所做的所有資料修改都會丢失。在許多情況下,這就是所需要的目标,因為可能對資料庫執行了某些應撤消的操作,恢複到過去某一時間點是删除那些不需要的事務處理的一種方法
1:在資料庫中進行rman全備操作
2:在資料庫中增加或删除某些圖層,然後記錄操作時間
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') time from dual;
3:基于時間點的恢複
在用RMAN恢複資料庫之前,我們先檢視一下資料庫的incarnation資訊
RMAN> list incarnation;
using target database control file instead of recovery catalog
List of Database Incarnations
DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time
------- ------- -------- ---------------- --- ---------- -------------- -----------
1 1 DG1 1762320829 PARENT 1 30-JUN-05
2 2 DG1 1762320829 PARENT 446075 18-APR-12
3 3 DG1 1762320829 CURRENT 699141 13-JUN-12
此時資料庫的狀态是DB Key=3
4:還原操作,還原到某一時間點
run{
set until time "to_date('2012-09-28 12:59:00','yyyy-mm-dd hh24:mi:ss')";
restore database;
recover database;
}
資料還原後,使用指令操作更改資料庫狀态,打開資料庫
alter database open resetlogs;
連接配接到資料庫,檢視資料是否恢複到該時間節點狀态
如果在還原到改時間節點時發生如下錯誤:
allocated channel: t1
channel t1: sid=157 devtype=DISK
executing command: SET until clause
released channel: t1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of set command at 06/24/2012 11:11:16
RMAN-20207: UNTIL TIME or RECOVERY WINDOW is before RESETLOGS time
則是由于incarnation狀态發生了變化
我們先檢視一下資料庫此時的incarnation狀态。
RMAN> list incarnation;
List of Database Incarnations
DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1 1 DG1 1762320829 PARENT 1 30-JUN-05
2 2 DG1 1762320829 PARENT 446075 18-APR-12
3 3 DG1 1762320829 PARENT 699141 13-JUN-12
4 4 DG1 1762320829 CURRENT 729844 24-JUN-12
可以清楚的看見資料庫目前的incarnation資訊從恢複前的DB Key=3變為DB Key=4
當我們将資料庫恢複到删除資料之後(即恢複點1),然後以resetlogs方式打開資料庫,此時資料庫就會以incarnation DB Key=3此時間點狀态打開一個新的incarnation DB Key=4資料庫(當資料庫恢複成功,隻要沒有執行alter database open resetlogs,那麼資料庫incarnation就會一直處于DB Key=3的狀态,此時由于歸檔日志和重做日志都是完整的,是以可以在此狀态下恢複到自RMAN全備後的任一時間點)。4這個狀态資料庫的歸檔日志和重做日志都是空的,且隻能從他打開的該時間點往後記錄資料庫的所有操作,而不能從該時間點回退資料庫操做,因為在4狀态下,沒有歸檔日志和重做日志,是以當恢複删除資料之後,在此基礎上在恢複其他資料,由于資料庫處于新的狀态4,沒有歸檔日志和重組日志,是以無法在此基礎上恢複資料。解決辦法就是重置資料庫到狀态3,然後直接恢複到删除EMP表之前的時間點即可。
重置到資料狀态3
RESET DATABASE TO INCARNATION 3;
然後進行恢複
run{
set until time "to_date('2012-09-28 12:59:00','yyyy-mm-dd hh24:mi:ss')";
restore database;
recover database;
}
恢複提示成功,此時我們打開資料庫檢查資料是否恢複成功
我們順便來檢視一下資料庫的incarnation資訊
RMAN> list incarnation;
List of Database Incarnations
DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1 1 DG1 1762320829 PARENT 1 30-JUN-05
2 2 DG1 1762320829 PARENT 446075 18-APR-12
3 3 DG1 1762320829 PARENT 699141 13-JUN-12
5 5 DG1 1762320829 CURRENT 729763 24-JUN-12
4 4 DG1 1762320829 ORPHAN 729844 24-JUN-12
果然又增加DB Key=5的incarnation資訊
當對資料庫執行恢複操作後,資料庫就會更新incarnation狀态,穿越incarnation後,将會産生孤兒incarnation(orphan),這個時候最好重新備份下資料庫