【轉】 RMAN備份與恢復實踐

ewelamb發表於2013-07-06

http://www.cnblogs.com/landexia/archive/2012/08/09/2629650.html

1   RMAN備份與恢復實踐

1.1  備份

1.1.1 對資料庫進行全備

  使用backup database命令執行備份

RMAN> BACKUP DATABASE;

  執行上述命令後將對目標資料庫中的所有資料檔案進行備份,由於沒有顯式指定FORMAT引數,rman會自動為每個備份片段命名,並儲存在ORACLE_HOME/database目錄下。

  當然,也可以透過顯式指定format引數來自定義備份片段的命令規則,比如:

RMAN> BACKUP DATABASE FORMAT 'D:\BACKUP\%U';

 

1.1.2 備份表空間

只要例項啟動並處於載入狀態,不論資料庫是否開啟,都可以在rman中對錶空間進行備份,而且不需要像手動備份那樣先'ALTER TABLESPACE ... BEGIN BACKUP'。例如:

RMAN> backup tablespace jweb;

同樣,我們在使用backup tablespace也可以透過顯式指定format引數自定義備份片段名稱。

我們再透過LIST BACKUP 檢視一下備份:

RMAN> LIST BACKUP OF TABLESPACE JWEB;

1.1.3 備份指定資料檔案

首先可以先透過資料字典DBA_DATA_FILES查詢出表空間對應的資料檔案及其序號,例如:

select file_name,file_id,tablespace_name from dba_data_files

然後再透過BACKUP DATAFILE備份指定序號的資料檔案,例如:

RMAN> BACKUP DATAFILE n;

 

如果要檢視指定資料檔案的備份,可以用:

RMAN> LIST BACKUP OF DATAFILE n;

注:n=指定的的資料檔案序號,如果需要備份的資料檔案有多個,n=多個序號,中間以逗號分隔即可。

 

1.1.4         備份控制檔案

控制檔案在ORACLE中的重要性是毋庸置疑的,你看,連RMAN都給予特殊的照顧,在RMAN中備份控制檔案的方式是最多的。

1.最簡單的方式,透過CONFIGURE命令將CONTROLFILE AUTOBACKUP置為ON。

RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;

然後你再透過rman做任何備份操作的同時,都會自動對控制檔案做備份。

 

2.對編號為1的資料檔案,即SYSTEM表空間的資料檔案做備份時,RMAN也會自動對控制檔案做備份。

 

3.手動執行備份命令。

RMAN> BACKUP CURRENT CONTROLFILE;

 

4.執行BACKUP時指定INCLUDE CURRENT CONTROLFILE引數,例如:

RMAN> BACKUP DATABASE INCLUDE CURRENT CONTROLFILE;

 

如果要檢視備份的控制檔案,可以透過:

RMAN> LIST BACKUP OF CONTROLFILE;

 

1.1.5 備份歸檔日誌檔案

歸檔日誌對於資料庫介質恢復相當關鍵,其雖然不像控制檔案那樣一旦損壞則資料庫馬上崩潰但重要性絲毫不減。歸檔日誌檔案能確保我們將資料庫恢復到備份之前的任意時刻。在RMAN中備份歸檔日誌有兩種方式:

1、利用BACKUP ARCHIVELOG命令備份

RMAN> BACKUP ARCHIVELOG ALL;

 

2、在BACKUP過程中利用PLUS ARCHIVELOG引數備份,例如:

RMAN> BACKUP DATABASE PLUS ARCHIVELOG;

則在備份資料庫的同時自動對所有歸檔檔案進行備份。這種方式與上種有什麼區別呢,區別太明顯了,BACKUP.....PLUS ARCHIVELOG命令在備份過程中會依次執行下列步驟:

1>.執行ALTER SYSTEM ARCHIVE LOG CURRENT語句對當前redolog進行歸檔。

2>.執行BACKUP ARCHIVELOG ALL命令備份所有已歸檔日誌。

3>.執行BACKUP命令對指定項進行備份。

4>.再次執行ALTER SYSTEM ARCHIVE LOG CURRENT對當前redolog歸檔。

5>.對新生成的尚未備份的歸檔檔案進行備份。

 

在完成歸檔日誌檔案備份後,我們透過需要刪除已備份過的歸檔檔案(歸檔檔案記錄下了資料庫進行過的所有操作,如果您的資料庫操作頻繁而且量大,那歸檔檔案大小也是相當恐怖,備份後刪除釋放儲存空間是相當有必要地)。RMAN提供了DELETE ALL INPUT引數,加在BACKUP命令後,則會在完成備份後自動刪除歸檔目錄中已備份的歸檔日誌。

完成備份之後,可以透過下列命令檢視已備份的歸檔日誌片段:

RMAN> LIST BACKUP OF ARCHIVELOG ALL;

 

1.1.6 建立增量備份

如果資料庫執行於不歸檔模式下,那麼你只能在資料庫乾淨關閉的情況下(以NORMAL、IMMEDIATE、TRANSACTIONAL方式關閉)才能進行一致性的增量備份,如果資料庫執行於歸檔模式下,那即可以在資料庫關閉狀態進行,也可以在資料庫開啟狀態進行備份。再次說明了開啟歸檔模式的優勢,歸檔日誌也就是多佔些磁碟空間,好處不是一些是很多,可是也相當於又給資料庫加了層保險啊。

 

建立增量備份也是相當簡單,實質就是一個引數INCREMENTAL LEVEL=n,在執行BACKUP命令時加上即可,例如,建立一個增量級別0的全庫備份:

RMAN> BACKUP INCREMENTAL LEVEL=0 DATABASE;

再例如,建立一個增量級別1的users01.dbf資料檔案備份

RMAN> BACKUP INCREMENTAL LEVEL=1 TABLESPACE SYSTEM DATAFILE 'F:\ORAHOME1\ORADATA\JSSWEB\USERS01.DBF';

 

注:Rman預設建立的增量備份是Differential方式,如果要建立Cumulative方式的增量備份,在執行BACKUP命令時顯式指定即可,例如:

RMAN> BACKUP INCREMENTAL LEVEL=2 CUMULATIVE DATABASE;

關於增量備份概念性解釋,比如Differential與Cumulative兩種方式間的區別請參考本篇外傳,括弧,外傳整理中,如果您看到本篇的時候外傳還沒出,這個。。。。表著急,耐心等候,麵包牛奶都會有的。

 

1.1.7 建立冗餘備份

RMAN提供了一種更謹慎的備份策略:Duplexed方式備份,其實質即是在生成備份集的同時,向指定位置生成指定份數(最大不超過4份)的備份集複製,以避免在災難性事故時資料庫損壞和備份丟失的情況下導致完全崩潰,提高備份可用性。當然,這是人類美好的願意,對於那些沒有異機異地備份條件的,假如機房發生火災、地震之類大災難,就算dba把備份檔案複製了100份也照樣玩完,上述是個假設,萬勿對號入座,火災、地震也不是哪都會發生地,大家好好活著,別害怕。

RMAN中提供了三種方式實現Duplexed方式備份:

1、在RMAN中執行BACKUP命令時顯式指定COPIES引數。例如:

RMAN> BACKUP COPIES 3 DATABASE;

上述命令將會在全庫備份的同時,自動生成當前備份集的2份複製到預設備份目錄。

 

2、在RUN{}命令塊中利用SET BACKUP COPIES命令為該命令塊中所有的BACKUP命令設定Duplexed方式,例如:

RMAN> RUN{

2>SET BACKUP COPIES 2;

3>BACKUP DEVICE TYPE DISK FORMAT 'D:\BACKUP1\%U','D:\BACKUP2\%U'

4>TABLESPACE USERS,SALES;

5>}

上述命令將生成兩份備份集,分別儲存到d:\backup1和d:\backup2目錄。

 

3、透過CONFIGURE ..... BACKUP COPIES命令設定預定義的備份Duplexed方式。

CONFIGURE ... BACKUP COPIES命令可以為指定的裝置型別設定預設的備份複製數量。這個配置僅適用於資料檔案與歸檔重做日誌檔案和備份,並且,只有在使用自動分配的通道時才能夠使用CONFIGURE ... BACKUP COPIES命令設定的配置。例如:

RMAN> CONFIGURE DEFAULT DEVICE TYPE TO DISK;

RMAN> CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE disk TO 2;

RMAN> CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE disk TO 2;

上述命令將disk設定上資料檔案與歸檔檔案的拷備數量設定為2,當再執行BACKUP DATABASE備份時,即會自動生成2份資料檔案的備份集。

 

1.1.8 編寫rman批處理檔案

儲存至:E:\oracleScript\backup\database_backup_jssweb.rman

RUN {

 CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;

 CONFIGURE CONTROLFILE AUTOBACKUP ON;

 CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'd:/backup/%F';

 ALLOCATE CHANNEL CH1 DEVICE TYPE DISK FORMAT 'd:/backup/%U';

 BACKUP DATABASE SKIP INACCESSIBLE FILESPERSET 10

   PLUS ARCHIVELOG FILESPERSET 20

   DELETE ALL INPUT;

 RELEASE CHANNEL CH1;

 }

 ALLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE DISK;

 CROSSCHECK BACKUPSET;

 DELETE NOPROMPT OBSOLETE;

 

上述的各項命令均在前面幾個章節中提到過,如果有看著眼生的話,再回去翻翻前面。命令是都知曉地,可能有幾個引數會不明白其意義,比如:BACKUP命令中的SKIT INACCESSIBLE引數,大家表著急,靜心等候俺的外。外外。。外外外。。。。(大鍋,看個筆記而已,您不用拎著把菜刀到處晃吧,你你你,你別過來,我說還不成嘛)en,看到大家如此虔誠,俺就提前透露這部分內容吧。

SKIP選項            說明

SKIP INACCESSIBLE:表示跳過不可讀的檔案。我們知道一些offline的資料檔案只要存在於磁碟上就仍然可被讀取,但是可能有些檔案已經被刪除或移到它處造成不可讀,加上這個引數就會跳過這些檔案;

SKIP OFFLINE:跳過offline的資料檔案;

SKIP READONLY:跳過那些所在表空間為read-only的資料檔案;

 

1.2  恢復

首先注意:rman備份的時候並不會備份臨時表空間的資料檔案(想想也是,反正是臨時的,備它幹嘛),所以完全恢復之後,如果臨時表空間的資料檔案也丟失,需要手工重新建立臨時表空間的資料檔案。據訊息靈通人士稱,10G之後的版本會在恢復過程中自動建立臨時表空間的資料檔案,手頭沒有環境(11g都出了,俺還在學9i,落後啊。),未經嘗試,有心的朋友如果落實該訊息,也不妨通知俺一下:)

 

  其次需要了解:Oracle資料庫的恢復實際上包含了兩個概念:資料庫修復(RESTORE)與資料庫恢復(RECOVER):

  資料庫修復:是指利用備份的資料庫檔案來替換已經損壞的資料庫檔案或者將其恢復到一個新的位置。RMAN在進行修復操作時,會利用恢復目錄(沒有建立恢復目錄的話就使用目標資料庫的控制檔案)來獲取備份資訊,並從中選擇最合適的備份進行修復操作。選擇備份時有兩個原則(1、選擇距離恢復目錄時刻最近;2、優先選擇映象複製,其次才是備份集)

  資料庫恢復:是指利用重做日誌或增量備份來重建丟失的資料。

 

1.2.1 對資料庫進行完全介質恢復

  過程有三個步驟:

  1、啟動資料庫到載入狀態

RMAN> SHUTDOWN IMMEDIATE;

RMAN> STARTUP MOUNT;

 

  2、執行恢復操作(記的我們剛說過的,恢復分兩步,有先有後的。)

  RMAN> RESTORE DATABASE;

  RMAN> RECOVER DATABASE DELETE ARCHIVELOGS SKIP TABLESPACE TEMP;

 

  注意:DELETE ARCHIVELOGS和SKIP TABLESPACE兩個引數是可選擇的,作用如下:

  DELETE ARCHIVELOGS:表示RMAN將在完成恢復過程後自動刪除那些在恢復過程中修復的歸檔日誌檔案。

  SKIP TABLESPACE:跳過指定表空間,比如臨時表,當然臨時表空間即使你不跳過它也不會恢復的。

 

  3、開啟資料庫

  RMAN> ALTER DATABASE OPEN;

  此處需要注意的一點是,如果你的資料庫並非處於歸檔模式,那麼必須使用ALTER DATABASE OPEN RESETLOGS來開啟資料庫,因為RMAN會認為在非歸檔模式下是一個不一致的備份,執行resetlogs之後,oracle將會把scn重新置為0。

 

1.2.2 恢復表空間

同樣也可以分成三個步驟:

  1、啟動資料庫到載入狀態

RMAN> SHUTDOWN IMMEDIATE;

RMAN> STARTUP MOUNT;

 

2、進行恢復操作,在恢復之前,如果需要被恢復的表空間未處於離線狀態,需要透過alter tablespace ... Offline語句將其置為離線:

RMAN> SQL 'ALTER TABLESPACE jweb OFFLINE IMMEDIATE';

RMAN> RESTORE TABLESPACE jweb;

RMAN> RECOVER TABLESPACE jweb;

RMAN> SQL 'ALTER TABLESPACE jweb ONLINE';

 

  3、開啟資料庫

  RMAN> ALTER DATABASE OPEN;

 

1.2.3  恢復資料檔案

事實上,恢復表空間實際就是恢復其所對應的資料檔案(一個表空間可能對應多個資料檔案),所以步驟與上相似。

  1、啟動資料庫到載入狀態

RMAN> SHUTDOWN IMMEDIATE;

RMAN> STARTUP MOUNT;

 

2、進行恢復操作,在恢復之前,如果需要被恢復的表空間未處於離線狀態,需要透過alter tablespace ... Offline語句將其置為離線,運算元據檔案時可以直接指定資料檔案,也可以以資料檔案序號代替:

RMAN>SQL 'ALTER DATABASE DATAFILE 10 OFFLINE;

RMAN> RESTORE DATAFILE 10;

RMAN> RECOVER DATAFILE 10;

RMAN>SQL ' ALTER DATABASE DATAFILE 10 ONLINE;

 

  3、開啟資料庫

  RMAN> ALTER DATABASE OPEN;

 

1.3  高階恢復

不完全恢復

不完全恢復是指不完全的資料恢復,不完全恢復與完全恢復在許多方面是相同的,他們基本的命令集相同,但不完全恢復新增了一些其他命令。 引起不完全恢復的原 因有很多,如丟失了聯機重做日誌或歸檔的重做日誌,或者出現重大的使用者錯誤。 不完全恢復會影響整個資料庫,換句話,不能只對資料庫的一部分執行不完全恢 復操作,因為這個會使資料庫的一部分具有與這個資料庫其餘部分不同的SCN和時間點。

要將資料庫資料還原到與資料庫剩餘部分不同的時間點,可以用基於 表空間時間恢復 或者用 閃回技術。 

不完全恢復方法包括:基於時間,SCN,日誌序列 或取消的恢復。

 

1.3.1       建立恢復點

使用RMAN執行不完全恢復操作時需要完成一個工作是簡歷恢復目標。恢復目錄是恢復程式的終點,通常我們基於一個時間點,一個指定的SCN 或者 一個日誌序列號來表示它。 我們可以採用許多不同的方法建立恢復目標。 

 

1.3.1.1   在run 程式碼塊中使用set 命令與until time,until SCN 或 until sequence引數

Run

{

Set until time "to_date('2010-07-05 14:02:00','yyyy-mm-dd hh24:mi:ss')";

Restore database;

Recover database alter database open resetlogs;

}

執行這條命令時,RMAN 會查詢與恢復目標時間最近(並非恢復目標時間本身也不能是位於恢復目標之間的時間)的備份集,並且從這個備份集中還原資料庫。 如果資料庫置於noarchivelog 模式中,恢復操作會在備份集的時間停止;否則在執行recover命令期間,oracle 會在所定義的恢復目標(不包含恢復目標本身)上應用歸檔的重做日誌(以及需要應用的任何增量備份)。

注意: 如果嘗試恢復到特定備份的完成點,則必須恢復到備份集中檔案的CKP SCN 或 CKP TIME,在不同備份集的RMAN list命令中會列出這些內容。 有時使用備份的CKP TIME 並不夠,還可能導致ORA-1152錯誤。

1.3.1.2   在restore 和recover 命令中直接使用until time,until SCN 和 until sequence 引數

這種方法避免使用run 程式碼塊,也傾向與使用這種方法。 

Startup mount;

Restore database until time "to_date('2010-07-05 14:02:00','yyyy-mm-dd hh24:mi:ss')";

Recover database until time "to_date('2010-07-05 14:02:00','yyyy-mm-dd hh24:mi:ss')";

Alter database open resetlogs;

 

1.3.2       基於時間的恢復

這種恢復型別允許使用者將資料庫恢復到與指定時間一致的狀態。 當然,如果不存在能將資料庫還原到使用者請求的時間的有效備份或歸檔重做日誌,Oracle 就會報RMAN-03002 和 RMAN-20207的錯誤。

必須具備在我們指定的恢復時間之前生成的資料庫備份,此外還需要所有歸檔的重做日誌。

 

1.3.3       基於SCN 的恢復

Oracle 允許使用者將資料庫恢復到指定的SCN,實際上,這並不是一種常見的恢復方法。示例如下:

Startup mount;

Restore database until SCN 1000;

Recover database until SCN 1000;

Alter database open resetlogs;

 

注意: 該示例可以將資料庫還原到SCN 1000,但是不會包含SCN.

 

1.3.4       基於日誌序列的恢復

RMAN 允許使用者將資料庫恢復到指定序列號的歸檔重做日誌。如果歸檔的重做日誌中存在間隙,使用這種恢復方法就非常方便。 間隙通常意味著我們只能將資料庫還原到間隙的開始點。 

Startup mount;

Restore database until sequence 100 thread 1;

Recover database until sequence 100 thread 1;

Alter database open resetlogs;

 

1.3.5       只讀表空間的恢復

在預設情況下,即使丟失了只讀的資料檔案,RMAN也不會在執行完全恢復資料庫還原操作時還原只讀的資料檔案。 要在完全恢復期間還原只讀的資料檔案,就必須在restore 命令中使用check readonly 引數,如:

Restore database check readonly;

 

注意,執行recover tablespace或recover datafile命令時,RMAN的工作情況是不一樣的。 使用這兩個命令時,不管表空間是否為只讀狀態都會執行恢復操作。

 

1.3.6       歸檔重做日誌的還原

在使用RMAN的普通恢復過程中,不必恢復歸檔的重做日誌。 不過,偶爾也會要求還原一個或多個歸檔的重做日誌。 例如,我們可能需要使用LogMiner 在備份中儲存的歸檔重做日誌檔案裡查詢一些資訊。

Restore archivelog all;

Restore archivelog from logseq=20 thread=1;

Restore archivelog from logseq=20 until logseq=30 thread=1;

 

還可以將歸檔的重做日誌還原到預設位置以外的位置上:

Run

{

Set archivelog destination to "d:/arch";

Restore archivelog all;

}

 

注意:1. 上例中的set 命令沒有替代方法,必須要求使用set。 

  2. 如果RMAN 認為一個歸檔的重做日誌已存在,就不會在磁碟上還原這個歸檔的重做日誌,即使設定的還原位置不同與預設的歸檔日誌位置,Oracle 也不會在這個新的位置上恢復歸檔的重做日誌。

 

1.3.7       資料檔案副本的還原

可以從資料檔案副本(不是備份集)中還原資料庫的資料檔案。 要實現這個功能,需要先使用restore from datafilecopy命令,然後再使用恢復資料庫(或表空間,資料檔案)的recover。

RMAN>Restore (datafile 5) from datafilecopy;  -- 此處的圓括號是必須的,如果沒有就報錯

RMAN>Recover datafile 5;

SQL>Alter database datafile 5 online;

 

執行restore 時,該命令會識別需要還原的資料檔案的最新副本,然後從這個副本中還原這些資料檔案。 資料檔案的最新副本可能是在一個資料檔案副本中,而不是在一個副本中。 在這種情況下,Oracle 會恢復這個資料檔案副本。 

 

1.3.1        使用resetlogslogs 命令

不完全恢復期間,通常需要使用resetlogs命令開啟資料庫,這是因為我們要從已經簡歷的現有日誌流中脫離出來,並且需要向Oracle 說明這種情況. Resetlogs 命令表示一個資料庫邏輯生存期的結束和另一個資料庫邏輯生存期的開始. 資料庫的邏輯生存期也稱為一個對應物(Incarnation). 每次使用resetlogs命令都會建立一個新的資料庫對應物,這對於恢復操作來說非常重要. 

每次使用resetlogs命令時,SCN 計數器不會被重置,不過Oracle 會重置其他計數器(如:日誌序列號),同時還會重置聯機重做日誌的內容.

Oracle 10g 簡化了透過resetlogs命令進行的恢復,在歸檔的重做日誌名中新增了一個新的特換串(%r),該字串表示resetlog ID 號。在log_archive_dest_format 引數串中包括%r時,歸檔的重做日誌名在每個resetlogs 命令中保持唯一。這種改動以及其他的內部Oracle 資料庫改動使oracle 可以很容易的透過給定的resetlogs操作恢復資料庫。因此,可以很容易的在執行操作後立刻備份資料庫,然而,我們仍然認為在任何不完全恢復後備份資料庫是很有必要的。

 

1.3.2       恢復訛誤的資料塊

即使與訛誤資料塊關聯的資料檔案一直聯機,也可以透過用塊介質恢復(block Media recover: BMR)執行塊級別恢復操作來修復Oracle 資料庫中的這些邏輯上或者物理上的訛誤資料塊。

一般出現資料塊錯誤時,都會有錯誤訊息:

ORA-01578: ORACLE data block corrupted (file #18,block #88)

 

如果沒有BMR時,我們必須從一個備份中恢復這個資料檔案,在恢復過程中,使用者不能使用該資料塊檔案中的所有資料。

用BMR恢復就很簡單,只需要執行blockrecover命令即可:

       Blockrecover datafile 18 block 88;

 

如果有必要,可以同時恢復多個資料檔案的多個資料塊。如:

       Blockrecover datafile 18 block 16,17,88,108;

       Blcokrecover datafile 18 block 88 datafile 19 blcok 188;

 

Oracle 會跟蹤在備份和恢復期間發生的資料塊訛誤。如果檢測到備份或複製操作出現訛誤,由於Oracle 不允許在備份中出現訛誤,所有這個備份就會失敗。 當然,可以配置RMAN允許一定數量的訛誤,但是不推薦這種用法。

可以使用backup validate database 命令檢視RMAN 檢測到的所有資料庫訛誤。這條命令會在v$backup_corruption 和v$database_block_corruption檢視中填充檢測到的所有訛誤資料塊。 如果訛誤發生在複製操作期間,v$copy_corruption檢視就會指明包含訛誤的備份集。

注意的是:v$backup_corruption 是一個顯示歷史訛誤的檢視,v$database_block_corruption 則是一個顯示當前資料塊訛誤的檢視。 一旦修正了資料庫的塊訛誤,就需要重新執行backup validate database命令,然後查詢v$database_block_corruption 檢視以確保不存在其他訛誤。

查詢v$database_block_corruption檢視可以檢視訛誤資料塊的詳細資訊。 如下所示,使用具有corruption list restore 引數的blockrecover命令可以方便地修正v$database_block_corruption 檢視中的訛誤資料塊。

       Blockrecover corruption list restore until time 'SYSDATE-5';

這條命令將還原訛誤列表中最近5天的所有訛誤資料塊。 在上面的命令中,還可以使用until time 和 until sequence.

 

 

1.3.3       恢復前一個對應物

一個資料庫的對應物(incarnation)對應這個資料庫的特定邏輯生存期。 有時我們需要使用上次執行resetlogs命令開啟資料庫前生成的一個備份來還原資料庫,或者可能需要還原到執行上一個resetlogs命令之前的時間點。 這就需要用到incarnation.

 

1.3.3.1   使用恢復目錄恢復前一個對應物

 先假設使用恢復目錄執行了備份操作,並且最近使用了resetlogs命令執行過時間點恢復,現在需要使用執行resetlogs命令之前的一個備份來恢復資料庫。

操作步驟:

(1)啟動但不載入例項,這是因為我們要先得到一個與恢復資料庫對應物關聯的控制檔案

(2)使用reset database to incarnation 命令為RMAN 指示對應物的備份集。

(3)Restore controlfile,使rman還原最新的控制檔案

(4)載入資料庫

(5)Restore 資料庫

(6)Recover 資料庫

(7)使用resetlogs 開啟資料庫

示例如下:

       C:/Users/Administrator.DavidDai>rman target / catalog rman/rman@orcl;

       RMAN> list incarnation;

       RMAN> startup force nomount;

       RMAN> reset database to incarnation 4;

       RMAN> restore controlfile;

       RMAN>  alter database mount;

       RMAN>  restore database until scn 940990;

       RMAN>  recover database until scn 940990;

       RMAN>  alter database open resetlogs;

 

1.3.3.2   不使用恢復目錄恢復前一個對應物

為了透過前一個對應物進行恢復,需要一個包含前一個對應物資訊的控制檔案。在大多數情況下,這可能是當前的控制檔案。如果當前的控制檔案不瞭解需要恢復的對應物,則需要還原包含該資訊的控制檔案,從而使得利用該方法恢復資料。可以使用list incarnation of database 命令檢視控制檔案瞭解哪些對應物.

沒有連線恢復目錄的list incarnation 輸出與已連線恢復目錄時的list incarnation 輸出有一些細微的區別。這是因為資訊從控制檔案中獲得的,因此某些鍵(如Inc key)將會不同。

操作步驟如下:

(1)從RMAN中執行list incarnation 命令,確定希望復位到哪個對應物

(2)關閉資料庫

(3)啟動載入資料庫

(4)執行reset database to incarnation 命令復位對應物

(5)使用restore 命令還原資料庫

(6)recover恢復資料庫

(7)使用resetlogs 開啟資料庫

 

示例如下:

       RMAN> list incarnation of database;

       RMAN>  shutdown immediate;

       RMAN>  startup mount;

       RMAN> reset database to incarnation 2; --將資料庫重置為原型 2

       RMAN> restore database until time "to_date('2010-7-5 23:50:39','yyyy-mm-dd hh24:mi:ss')";

       RMAN> recover database until time "to_date('2010-7-5 23:50:39','yyyy-mm-dd hh24:mi:ss')";

       RMAN> alter database open resetlogs;

       RMAN> list incarnation;

 

注: until 後面可以跟三種型別: 

1. restore database until time "to_date('2010-7-5 23:50:39','yyyy-mm-dd hh24:mi:ss')";

2. recover database until scn 1000

3. recover database until sequence 150;

檢視sequence:

SQL> select sequence# from v$archived_log;

 SEQUENCE#

       161

       162

         1

         2

         3

         4

從這個結果也證明resetlogs 會重置sequnce,但是scn不會被重置。

 

檢視scn:

SQL> select current_scn from v$database;

CURRENT_SCN

-----------

8555698

SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER

------------------------

 8555706

 

 

1.3.4       表空間時間點恢復

使用表空間時間點恢復(TSPITR)可以將一個或多個非SYSTEM表空間恢復到與資料庫其他部分不同的某個時間點上。這點和Flashback 有點型別。 比如使用者誤刪了3張表,我們就可以用TSPITR恢復。

 

先看TSPITR 的工作流程,如下圖所示:

(1) 在輔助例項上用target的備份集restore 資料檔案

(2) 在輔助庫上用target的歸檔檔案recover 資料檔案

(3) 在輔助庫上匯出相關資料

(4) 修改主庫的控制檔案

(5) 用輔助庫上匯出檔案匯入輔助庫上。

 


 

 

 

 

幾個相關相關的定義:

輔助例項(Auxiliary instance):我們建立的臨時例項,RMAN可以使用這個例項執行TSPITR,完成TSPITR操作後,可以刪除輔助例項。

輔助資料庫(Auxiliary database):主資料庫的一個複本或子集,用於表空間的臨時恢復。

主資料庫(Primary database):需要TSPITR的資料庫。

恢復集(Recovery set):構成恢復到某一個時間點表空間的表空間或資料檔案,SYSTEM表空間資料檔案不能作為恢復集的一部分。

輔助集(Auxiliary set):需要執行TSPITR的其他目標資料庫檔案集。 輔助集包括備份控制檔案,回滾和撤銷段表空間資料檔案,system表空間資料檔案,輔助資料庫的聯機重做日誌,以及一個可選的位於輔助資料庫中的臨時的表空間。

目標例項(target instance):包含將要恢復的表空間

 

1.3.4.1   為TSPITR 做準備

在開始執行TSPITR之前需要完成一些步驟。 

(1) 確定還原的時間點

這是最關鍵的因素。 我們需要認真對待這項操作,因為如果沒有使用恢復目錄,則表空間的恢復是一次性的過程。 如果錯誤地標識了恢復的時間點,則不能重新來過。 如果使用恢復目錄,則不存在這種限制。

 

(2) 確定傳送集中的物件是自包含的

應該使用TS_PITR_CHECK 檢視來確保恢復集是完整的,並且標識所有可能要用到的其他表空間。 首先需要檢查TS_PITR_CHECK 檢視來確保沒有其他相關的表空間。 比如我們檢查DAVE 表空間,示例程式碼如下:

/* Formatted on 2010/7/7 17:10:00 (QP5 v5.115.810.9015) */

SELECT   obj1_owner,

         obj1_name,

         obj1_type,

         reason

  FROM   sys.ts_pitr_check

 WHERE   (ts1_name IN ('BL') AND ts2_name NOT IN ('BL'))

         OR (ts1_name NOT IN ('BL') AND Ts2_Name IN ('BL'))

 

如果沒有衝突,則不會返回任何行。 如果存在衝突,則會看到描述的每個衝突的行。如果有衝突,我們也需要還原關聯的表空間。

 

(3) 儲存可能丟失的物件或資料

如果我們將Dave表空間恢復之前的某個時間,那麼在這個時間以後的任何更改,如新建物件,更新,插入或者刪除,都會丟失。 丟失這些物件可能沒有問題,但假設我們需要儲存這些資料,則需要匯出將要儲存的資料,或者將資料複製到資料庫中的其他位置。 Oracle 提供了檢視 TS_PITR_OBJECTS_TO_BEDROPPED, 該檢視列出了將在恢復操作期間丟失的所有物件。 使用該檢視可以確定表空間中的物件在恢復之後的狀態。

SQL> col owner format a10

SQL> col name format a10

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

SQL> SELECT  *  FROM   ts_pitr_objects_to_be_dropped WHERE  tablespace_name = 'BL' ;

 

OWNER      NAME       CREATION_TIME       TABLESPACE_NAME

---------- ---------- ------------------- ------------------------------

BL         BL         2010-07-07 19:24:18    BL

 

1.3.4.2   執行實際的TSPITR

Oracle Database 10g將為我們執行自動的TSPITR,這意味著它將建立輔助例項。 在這種情況下,我們只需要連線目標資料庫和可選的恢復目錄(如果有的話),並且執行recover tablespace 命令。 RMAN 將為我們完成剩餘的工作。

下 面演示使用recover tablespace 命令恢復BL 表空間的示例。 我們使用可選的auxiliary destination來指示 RMAN 和 Oracle 應該在何處建立與輔助資料庫關聯的檔案。 使用該引數使得該恢復成為一個具有自動化例項的自定義TSPITR。 如果沒有使 用該引數,TSPITR 就稱為完全自動的TSPITR 恢復。

需 要注意的是,如果使用auxiliary destination引數,則應該已經建立了目標目錄,並且Oracle 必須能夠寫入到該目標目錄。 在目 標路徑名中沒有字尾的斜槓(/或/),如果包含斜槓將會導致TSPITR失敗,並且獲得錯誤訊息無法確切地描述該問題。命令如下:

 

Recover tablespace BL until time "to_date('2010-7-7 20:38:18','yyyy-mm-dd hh24:mi:ss')" auxiliary destination 'F:/bl'

 

在執行這個命令之前有幾點注意的地方,因為TSPITR 會用已經存在的備份集和歸檔檔案來建立輔助資料庫,所以在執行該命令之前需要確認target 資料庫有備份和歸檔,並且控制檔案也要有備份。 

 

RMAN> Recover tablespace BL until time "to_date('2010-7-7 20:40:18','yyyy-mm-dd hh24:mi:ss')" auxiliary destination 'F:/bl';

啟動 recover 於 07-7月 -10

使用目標資料庫控制檔案替代恢復目錄

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: SID=145 裝置型別=DISK

RMAN-05026: 警告: 假定以下表空間集適用於指定的時間點

表空間列表要求具有 UNDO 段

表空間 SYSTEM

表空間 UNDOTBS1

使用 SID='iEfs' 建立自動例項  -- 這裡是系統自動建立的輔助資料庫名

供自動例項使用的初始化引數:

db_name=BL

db_unique_name=iEfs_tspitr_BL

compatible=11.2.0.0.0

db_block_size=8192

db_files=200

sga_target=280M

processes=50

db_create_file_dest=F:/bl

log_archive_dest_1='location=F:/bl'

#No auxiliary parameter file used

啟動自動例項 BL

Oracle 例項已啟動

系統全域性區域總計     292933632 位元組

Fixed Size                     1374164 位元組

Variable Size                100665388 位元組

Database Buffers             184549376 位元組

Redo Buffers                   6344704 位元組

自動例項已建立

對恢復集表空間執行 TRANSPORT_SET_CHECK

TRANSPORT_SET_CHECK 已成功完成

記憶體指令碼的內容:

{

# set requested point in time

set until  time "to_date('2010-7-7 20:40:18','yyyy-mm-dd hh24:mi:ss')";

# restore the controlfile

restore clone controlfile;

# mount the controlfile

sql clone 'alter database mount clone database';

# archive current online log

sql 'alter system archive log current';

# avoid unnecessary autobackups for structural changes during TSPITR

sql 'begin dbms_backup_restore.AutoBackupFlag(FALSE); end;';

}

正在執行記憶體指令碼

正在執行命令: SET until clause

啟動 restore 於 07-7月 -10

分配的通道: ORA_AUX_DISK_1

通道 ORA_AUX_DISK_1: SID=59 裝置型別=DISK

通道 ORA_AUX_DISK_1: 正在開始還原資料檔案備份集

通道 ORA_AUX_DISK_1: 正在還原控制檔案

通道 ORA_AUX_DISK_1: 正在讀取備份片段 D:/APP/ADMINISTRATOR/FLASH_RECOVERY_AREA/B

L/AUTOBACKUP/2010_07_07/O1_MF_S_723759094_638VQR8R_.BKP

通道 ORA_AUX_DISK_1: 段控制程式碼 = D:/APP/ADMINISTRATOR/FLASH_RECOVERY_AREA/BL/AUTOBA

CKUP/2010_07_07/O1_MF_S_723759094_638VQR8R_.BKP 標記 = TAG20100707T201134

通道 ORA_AUX_DISK_1: 已還原備份片段 1

通道 ORA_AUX_DISK_1: 還原完成, 用時: 00:00:02

輸出檔名=F:/BL/BL/CONTROLFILE/O1_MF_638Y5Y3J_.CTL

完成 restore 於 07-7月 -10

sql 語句: alter database mount clone database

sql 語句: alter system archive log current

sql 語句: begin dbms_backup_restore.AutoBackupFlag(FALSE); end;

記憶體指令碼的內容:

{

# set requested point in time

set until  time "to_date('2010-7-7 20:40:18','yyyy-mm-dd hh24:mi:ss')";

# set destinations for recovery set and auxiliary set datafiles

set newname for clone datafile  1 to new;

set newname for clone datafile  3 to new;

set newname for clone datafile  2 to new;

set newname for clone tempfile  1 to new;

set newname for datafile  5 to

 "D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF";

# switch all tempfiles

switch clone tempfile all;

# restore the tablespaces in the recovery set and the auxiliary set

restore clone datafile  1, 3, 2, 5;

switch clone datafile all;

}

正在執行記憶體指令碼

正在執行命令: SET until clause

正在執行命令: SET NEWNAME

正在執行命令: SET NEWNAME

正在執行命令: SET NEWNAME

正在執行命令: SET NEWNAME

正在執行命令: SET NEWNAME

臨時檔案 1 在控制檔案中已重新命名為 F:/BL/BL/DATAFILE/O1_MF_TEMP_%U_.TMP

 

啟動 restore 於 07-7月 -10

使用通道 ORA_AUX_DISK_1

通道 ORA_AUX_DISK_1: 正在開始還原資料檔案備份集

通道 ORA_AUX_DISK_1: 正在指定從備份集還原的資料檔案

通道 ORA_AUX_DISK_1: 將資料檔案 00001 還原到 F:/BL/BL/DATAFILE/O1_MF_SYSTEM_%U_.DBF

通道 ORA_AUX_DISK_1: 將資料檔案 00003 還原到 F:/BL/BL/DATAFILE/O1_MF_UNDOTBS1_%U_.DBF

通道 ORA_AUX_DISK_1: 將資料檔案 00002 還原到 F:/BL/BL/DATAFILE/O1_MF_SYSAUX_%U_.DBF

通道 ORA_AUX_DISK_1: 將資料檔案 00005 還原到 D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF

通道 ORA_AUX_DISK_1: 正在讀取備份片段 F:/BACKUP/BL_02LI7BSK_1_1.BAK

通道 ORA_AUX_DISK_1: 段控制程式碼 = F:/BACKUP/BL_02LI7BSK_1_1.BAK 標記 = TAG20100707T200956

通道 ORA_AUX_DISK_1: 已還原備份片段 1

通道 ORA_AUX_DISK_1: 還原完成, 用時: 00:02:46

完成 restore 於 07-7月 -10

 

資料檔案 1 已轉換成資料檔案副本

輸入資料檔案副本 RECID=4 STAMP=723761776 檔名=F:/BL/BL/DATAFILE/O1_MF_SYSTEM_638Y6B6B_.DBF

資料檔案 3 已轉換成資料檔案副本

輸入資料檔案副本 RECID=5 STAMP=723761776 檔名=F:/BL/BL/DATAFILE/O1_MF_UNDOTBS1_638Y6B8V_.DBF

資料檔案 2 已轉換成資料檔案副本

輸入資料檔案副本 RECID=6 STAMP=723761777 檔名=F:/BL/BL/DATAFILE/O1_MF_SYSAUX_638Y6B7Q_.DBF

 

記憶體指令碼的內容:

{

# set requested point in time

set until  time "to_date('2010-7-7 20:40:18','yyyy-mm-dd hh24:mi:ss')";

# online the datafiles restored or switched

sql clone "alter database datafile  1 online";

sql clone "alter database datafile  3 online";

sql clone "alter database datafile  2 online";

sql clone "alter database datafile  5 online";

# recover and open resetlogs

recover clone database tablespace  "BL", "SYSTEM", "UNDOTBS1", "SYSAUX" delete archivelog;

alter clone database open resetlogs;

}

正在執行記憶體指令碼

 

正在執行命令: SET until clause

sql 語句: alter database datafile  1 online

sql 語句: alter database datafile  3 online

sql 語句: alter database datafile  2 online

sql 語句: alter database datafile  5 online

 

啟動 recover 於 07-7月 -10

使用通道 ORA_AUX_DISK_1

 

正在開始介質的恢復

執行緒 1 序列 7 的歸檔日誌已作為檔案 D:/ARCHIVELOG/BL_ARC0000000007_0723658881.0001 存在於磁碟上

執行緒 1 序列 8 的歸檔日誌已作為檔案 D:/ARCHIVELOG/BL_ARC0000000008_0723658881.0001 存在於磁碟上

執行緒 1 序列 9 的歸檔日誌已作為檔案 D:/ARCHIVELOG/BL_ARC0000000009_0723658881.0001 存在於磁碟上

歸檔日誌檔名=D:/ARCHIVELOG/BL_ARC0000000007_0723658881.0001 執行緒=1 序列=7

歸檔日誌檔名=D:/ARCHIVELOG/BL_ARC0000000008_0723658881.0001 執行緒=1 序列=8

歸檔日誌檔名=D:/ARCHIVELOG/BL_ARC0000000009_0723658881.0001 執行緒=1 序列=9

介質恢復完成, 用時: 00:00:14

完成 recover 於 07-7月 -10

 

資料庫已開啟

記憶體指令碼的內容:

{

# online the tablespaces that will be exported

sql clone 'alter tablespace  BL online';

# make read only the tablespace that will be exported

sql clone 'alter tablespace  BL read only';

# create directory for datapump import

sql "create or replace directory TSPITR_DIROBJ_DPDIR as ''

F:/bl''";

# create directory for datapump export

sql clone "create or replace directory TSPITR_DIROBJ_DPDIR as ''

F:/bl''";

}

正在執行記憶體指令碼

sql 語句: alter tablespace  BL online

sql 語句: alter tablespace  BL read only

sql 語句: create or replace directory TSPITR_DIROBJ_DPDIR as ''F:/bl''

sql 語句: create or replace directory TSPITR_DIROBJ_DPDIR as ''F:/bl''

 

正在執行後設資料匯出...

   EXPDP> 啟動 "SYS"."TSPITR_EXP_iEfs":

   EXPDP> 處理物件型別 TRANSPORTABLE_EXPORT/PLUGTS_BLK

   EXPDP> 處理物件型別 TRANSPORTABLE_EXPORT/TABLE

   EXPDP> 處理物件型別 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK

   EXPDP> 已成功載入/解除安裝了主表 "SYS"."TSPITR_EXP_iEfs"

   EXPDP> ******************************************************************************

   EXPDP> SYS.TSPITR_EXP_iEfs 的轉儲檔案集為:

   EXPDP>   F:/BL/TSPITR_IEFS_51961.DMP

   EXPDP> ******************************************************************************

   EXPDP> 可傳輸表空間 BL 所需的資料檔案:

   EXPDP>   D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF

   EXPDP> 作業 "SYS"."TSPITR_EXP_iEfs" 已於 20:59:10 成功完成

匯出完畢

記憶體指令碼的內容:

{

# shutdown clone before import

shutdown clone immediate

# drop target tablespaces before importing them back

sql 'drop tablespace  BL including contents keep datafiles';

}

正在執行記憶體指令碼

資料庫已關閉

資料庫已卸裝

Oracle 例項已關閉

sql 語句: drop tablespace  BL including contents keep datafiles

正在執行後設資料匯入...

   IMPDP> 已成功載入/解除安裝了主表 "SYS"."TSPITR_IMP_iEfs"

   IMPDP> 啟動 "SYS"."TSPITR_IMP_iEfs":

   IMPDP> 處理物件型別 TRANSPORTABLE_EXPORT/PLUGTS_BLK

   IMPDP> 處理物件型別 TRANSPORTABLE_EXPORT/TABLE

   IMPDP> 處理物件型別 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK

   IMPDP> 作業 "SYS"."TSPITR_IMP_iEfs" 已於 21:00:49 成功完成

匯入完畢

 

記憶體指令碼的內容:

{

# make read write and offline the imported tablespaces

sql 'alter tablespace  BL read write';

sql 'alter tablespace  BL offline';

# enable autobackups after TSPITR is finished

sql 'begin dbms_backup_restore.AutoBackupFlag(TRUE); end;';

}

正在執行記憶體指令碼

 

sql 語句: alter tablespace  BL read write

sql 語句: alter tablespace  BL offline

sql 語句: begin dbms_backup_restore.AutoBackupFlag(TRUE); end;

 

刪除自動例項

自動例項已刪除

已刪除輔助例項檔案 F:/BL/BL/DATAFILE/O1_MF_TEMP_638YDTJF_.TMP

已刪除輔助例項檔案 F:/BL/BL/ONLINELOG/O1_MF_3_638YDJ2V_.LOG

已刪除輔助例項檔案 F:/BL/BL/ONLINELOG/O1_MF_2_638YDDND_.LOG

已刪除輔助例項檔案 F:/BL/BL/ONLINELOG/O1_MF_1_638YD9K7_.LOG

已刪除輔助例項檔案 F:/BL/BL/DATAFILE/O1_MF_SYSAUX_638Y6B7Q_.DBF

已刪除輔助例項檔案 F:/BL/BL/DATAFILE/O1_MF_UNDOTBS1_638Y6B8V_.DBF

已刪除輔助例項檔案 F:/BL/BL/DATAFILE/O1_MF_SYSTEM_638Y6B6B_.DBF

已刪除輔助例項檔案 F:/BL/BL/CONTROLFILE/O1_MF_638Y5Y3J_.CTL

完成 recover 於 07-7月 -10

RMAN>

 

一旦完成了TSPITR,我們就應該能夠檢視到已經恢復的表空間中的物件,並且發現他們已經被恢復到請求的時間點。 我們需要將恢復的表空間改回到聯機狀態以使用它們。 

 

SQL> select tablespace_name,online_status from dba_data_files;

TABLESPACE_NAME     ONLINE_

------------------------------ -------

USERS                 ONLINE

UNDOTBS1             ONLINE

SYSAUX               ONLINE

SYSTEM               SYSTEM

BL                     OFFLINE

SQL> Alter tablespace BL online;

表空間已更改。

 

如果產生錯誤,Oracle 就會保持輔助例項和相關資料檔案的完整性。 我們可以嘗試修正問題並重新啟動恢復操作。 在這種情況下,使用auxiliary引數重新啟動RMAN,並且連線輔助例項。

如果輔助例項的建立工作沒有完全成功,可以很容易的刪除輔助例項和它的服務,而不是使用手工的TSPITR過程重新啟動恢復操作。首先,指出失敗的原因,然後刪除例項和服務,並且重新啟動自動的TSPITR過程。

刪除輔助例項,用sysdba連線sqlplus,然後執行一下命令即可:

SQL> conn / as sysdba

已連線。

SQL>  exec dbms_backup_restore.manageauxinstance('sjus',1);

PL/SQL 過程已成功完成。

這裡的sjus 是輔助例項名,在RMAN的輸出中有顯示。這使TSPITR恢復之前清除所有舊的輔助例項,可以在執行該命令後進入輔助目標目錄,並刪除該目錄中的任何檔案。

 

 

1.3.4.3   帶有自動化例項的自定義自動TSPITR

在執行TSPITR時可以使用自定義自動化例項建立,並且仍然允許Oracle 建立例項的其他的方法:

(1) 使用set newname 命令指示恢復集的單個資料檔案的位置

(2) 使用configure auxname命令定義輔助例項名

(3) 為輔助例項建立自己的控制檔案,並且在引數檔案中提供引數(如:db_file_name_convert)。透過在$ORACLE_HOME/rdbms/admin 中建立名為parms_auxint.ora 檔案來完成這項工作。 作為選擇,我們可以使用RMAN命令set auxiliary instance parameter file 來指定輔助例項引數檔案駐留在客戶端上的路勁。

 

一旦已經自定義了輔助例項,就可以透過執行recover tablespace 命令讓RMAN 建立輔助例項。

 

1.3.4.4   手工執行TSPITR

Oracle 支援為TSPITR 建立自己的輔助例項。 也可以使用手工的TSPITR來完成失敗的自動TSPITR操作。 首先,依然是應用前面的準備階段中列出的步驟,接著必須準備輔助例項,然後執行TSPITR過程。

 

準備輔助例項

首先,需要啟動和執行輔助例項。輔助例項只是RMAN用於執行TSPITR的臨時例項。 輔助例項必須駐留在與目標資料庫相同的機器中,並且在輔助例項上不能執行任何型別的DML。

在啟動TSPITR前,需要準備輔助例項。和普通的資料庫例項建立一樣。 

Windows Oracle 10G手工建立資料庫

http://blog.csdn.net/tianlesoftware/archive/2009/10/17/4680230.aspx

 

    linux 下手工新建資料庫

http://blog.csdn.net/tianlesoftware/archive/2009/10/17/4680213.aspx

 

我們假設建立的輔助例項名是TEST. 操作步驟如下:

 

(1) 建立口令檔案

C:>orapwd file=D:/app/Administrator/product/11.2.0/dbhome_1/database/PWDTEST.ora password=admin

(2) 建立服務

C:/>oradim -new -sid TEST

oradim是建立例項的工具程式名稱,-new表明執行新建例項,-delete表明執行刪掉例項,-sid指定害例的名稱。 

(3) 建立引數檔案

輔助資料庫的引數檔案不同於目標資料庫所使用的引數檔案。輔助例項中應該新增的一些引數如下表:

引數名

可選或必選

說明

Db_name

可選

與目標資料庫相同的名稱

Lock_name_space

必選

不同於建立輔助例項所在系統上其他資料庫名的唯一名稱。

Db_file_name_convert

可選

用RMAN還原輔助資料庫中的資料檔案時,該引數用於為這些資料檔案定義一組檔案命名轉換模式。 它可以代替RMAN的configure auxname命令。

Log_file_name_convert

可選

用RMAN還原輔助資料庫中的重做日誌時,該引數用於為這些重做日誌定義一組命令轉換模式。 它可以代替RMAN的set newnameml .

Control_files

必要

這個引數定義了輔助例項控制檔案的名稱和位置。 輔助例項控制檔案的名稱應當不同於鎖一定位置中已有的其他控制檔名。

Remote_login_passwordfile

 

可選/必要

用於允許RMAN 透過Oracle networking 服務連線輔助資料庫。 要求存在一個當前的口令檔案。 如果要本地連線輔助資料庫,就不需要設定該引數。

Compatible

必要

必須與目標資料庫的設定相同

Db_block_size

可選/必要

如果在目標資料庫上設定了該引數,在輔助資料庫中也必須設定為同樣的引數值。 

 

我們將所有輔助例項都放到F:/TEST目錄下,輔助例項的引數如下:

db_name=BL

db_unique_name=TEST

db_block_size=8192

db_cache_size=8388608

timed_statistics=TRUE

shared_pool_size=110M

large_pool_size=1M

 

compatible=11.2.0.0.0

 

Background_dump_dest=F:/TEST

Core_dump_dest=F:/TEST

User_dump_dest=F:/TEST

Control_files=F:/TEST/control01.ctl

 

db_create_file_dest=F:/TEST

log_file_name_convert=('D:/app/Administrator/oradata/bl','F:/TEST');

 

將該引數儲存為initTEST.ora, 存放在F:/TEST/下。

(4) 啟動輔助例項,並檢查網路連通性

C:/Users/Administrator.DavidDai>set ORACLE_SID=TEST

C:/Users/Administrator.DavidDai>sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 星期四 7月 8 15:52:17 2010

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

SQL> conn / as sysdba

已連線到空閒例程。

SQL> startup nomount pfile='f:/test/inittest.ora';

ORA-32006: BACKGROUND_DUMP_DEST initialization parameter has been deprecated

ORA-32006: USER_DUMP_DEST initialization parameter has been deprecated

ORACLE 例程已經啟動。

Total System Global Area  163221504 bytes

Fixed Size                  1373236 bytes

Variable Size             146803660 bytes

Database Buffers            8388608 bytes

Redo Buffers                6656000 bytes

SQL>

 

(5) 執行帶有手工輔助例項的TSPITR

用RMAN 連線目標資料庫,輔助例項,和恢復目錄(如果有)。

 

還原控制檔案,開啟輔助例項。 

C:/Users/Administrator.DavidDai>set ORACLE_SID=TEST

C:/Users/Administrator.DavidDai>rman target sys/admin@bl auxiliary=/

恢復管理器: Release 11.2.0.1.0 - Production on 星期四 7月 8 16:05:56 2010

 

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

連線到目標資料庫: BL (DBID=680066685)

已連線到輔助資料庫: BL (未裝載)

RMAN>    run

2>      {

3>      set until  time "to_date('2010-7-8 16:23:18','yyyy-mm-dd hh24:mi:ss')";

4>      restore clone controlfile ;

5>      sql clone 'alter database mount clone database';

6>      sql 'alter system archive log current';

7>      }

正在執行命令: SET until clause

啟動 restore 於 08-7月 -10

使用通道 ORA_AUX_DISK_1

 

通道 ORA_AUX_DISK_1: 正在開始還原資料檔案備份集

通道 ORA_AUX_DISK_1: 正在還原控制檔案

通道 ORA_AUX_DISK_1: 正在讀取備份片段 D:/APP/ADMINISTRATOR/FLASH_RECOVERY_AREA/B

L/AUTOBACKUP/2010_07_08/O1_MF_S_723831710_63C2O0HN_.BKP

通道 ORA_AUX_DISK_1: 段控制程式碼 = D:/APP/ADMINISTRATOR/FLASH_RECOVERY_AREA/BL/AUTOBA

CKUP/2010_07_08/O1_MF_S_723831710_63C2O0HN_.BKP 標記 = TAG20100708T162150

通道 ORA_AUX_DISK_1: 已還原備份片段 1

通道 ORA_AUX_DISK_1: 還原完成, 用時: 00:00:02

輸出檔名=F:/TEST/CONTROL01.CTL

完成 restore 於 08-7月 -10

 

sql 語句: alter database mount clone database

sql 語句: alter system archive log current

RMAN>

 

說明:1. alter system archive log current,它確保用於副本資料庫恢復的所有重做都可用。 

      2. Sql colne 命令是在副本資料庫上執行sql命令

 

確定並還原資料檔案

 我們需要還原system,sysaux, undo, temp 表空間,和我們將要還原的表空間,這裡是BL 表空間。要注意的是,在我們開始建立輔助例項之前,要將待恢復的表空間設定為offline.

 

SQL> select file_id,tablespace_name from dba_data_files;

   FILE_ID TABLESPACE_NAME

---------- ------------------------------

         4 USERS

         3 UNDOTBS1

         2 SYSAUX

         1 SYSTEM

         5 BL

SQL> alter tablespace BL offline for recover;

表空間已更改。

 

RMAN> run

2> {

3> # set requested point in time

4> set until  time "to_date('2010-7-8 16:23:18','yyyy-mm-dd hh24:mi:ss')";

5> # set destinations for recovery set and auxiliary set datafiles

6> set newname for clone datafile  1 to new;

7> set newname for clone datafile  3 to new;

8> set newname for clone datafile  2 to new;

9> set newname for clone tempfile  1 to new;

10> set newname for datafile  5 to  "D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF";

11> # switch all tempfiles

12> switch clone tempfile all;

13> # restore the tablespaces in the recovery set and the auxiliary set

14> restore clone datafile  1, 3, 2, 5;

15> switch clone datafile all;

16> }

 

說明: set newname for clone 命令確保還原期間正確的命令這些檔案。 對資料檔案5進行set newname是為還原該資料檔案做準備。

 

開啟輔助例項,準備執行TSPITR:

run

{

# set requested point in time

set until  time "to_date('2010-7-8 16:23:18','yyyy-mm-dd hh24:mi:ss')";

# online the datafiles restored or switched

sql clone "alter database datafile  1 online";

sql clone "alter database datafile  3 online";

sql clone "alter database datafile  2 online";

sql clone "alter database datafile  5 online";

# recover and open resetlogs

recover clone database tablespace  "BL", "SYSTEM", "UNDOTBS1", "SYSAUX" delete archivelog;

alter clone database open resetlogs;

}

 

匯出後設資料,在匯入資料

Exp user/pwd point_in_time_recover=y tablespaces=BL file=tspitr.dmp

Imp user/pwd point_in_time_recover=y file=tspitr.dmp

 

最後將BL表空間online

Alter tablespace BL online. 

 

操作完成後,別忘了重新備份資料庫,及刪除輔助例項。

從上面的步驟來看,手工操作和自動步驟是一樣的,只不過手工將這些步驟分開了。

 

1.3.4.5   TSPITR的限制

TSPITR 有許多的限制:

(1)不能還原包含SYS使用者特有物件的表空間

(2)不能用TSPITR恢復含有複製主表的表空間

(3)不支援使用快照日誌的表空間

(4)不能還原含有回滾段的表空間

(5)如果要恢復的表空間中的物件包含如下物件,則不支援:

Varray

巢狀表

外部檔案

此外,TSPITR 不能用於恢復刪除的表空間,我們也不能恢復舊的物件統計表。

 

如果使用不含恢復目錄的RMAN,還會存在下面與TSPITR的限制:

(1)在要恢復的點和當前的點之間,目標資料庫中撤銷和回滾段的當前物理結構必須沒有變化。 回滾段在恢復期間不能發生變化。

(2)完成指定表空間的TSPITR後,這個表空間以前的所有備份就不能在用於以後的TSPITR。 這就是TSPITR後的表空間備份操作非常重要的原因,只有再次備份表空間後才能執行下一個TSPITR.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7191998/viewspace-765661/,如需轉載,請註明出處,否則將追究法律責任。

相關文章