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.