天天看點

RMAN基于時間點恢複不完全恢複

我們知道,對歸檔下的資料庫做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),這個時候最好重新備份下資料庫