【转】RMAN 高级恢复
?來源:http://blog.csdn.net/tianlesoftware/article/details/5722174
?
1.?不完全恢復2.?基于RMAN?的恢復主題
3.?表空間時間點恢復
4.?驗證備份可恢復
5.?跨平臺的數據庫移動和RMAN
?
?
一.?不完全恢復
不完全恢復是指不完全的數據恢復,不完全恢復與完全恢復在許多方面是相同的,他們基本的命令集相同,但不完全恢復添加了一些其他命令。?引起不完全恢復的原因有很多,如丟失了聯機重做日志或歸檔的重做日志,或者出現重大的用戶錯誤。?不完全恢復會影響整個數據庫,換句話,不能只對數據庫的一部分執行不完全恢復操作,因為這個會使數據庫的一部分具有與這個數據庫其余部分不同的SCN和時間點。
要將數據庫數據還原到與數據庫剩余部分不同的時間點,可以用基于?表空間時間恢復?或者用?閃回技術。?
不完全恢復方法包括:基于時間,SCN,日志序列?或取消的恢復。
?
1.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操作恢復數據庫。?因此,可以很容易的在執行操作后立刻備份數據庫,然而,我們仍然認為在任何不完全恢復后備份數據庫是很有必要的。
?
Oracle?Rman跨resetlogs版本恢復
http://blog.csdn.net/tianlesoftware/archive/2009/10/17/4682463.aspx
?
?
1.2?建立恢復點
使用RMAN執行不完全恢復操作時需要完成一個工作是建立恢復目標。恢復目錄是恢復進程的終點,通常我們基于一個時間點,一個指定的SCN?或者?一個日志序列號來表示它。?我們可以采用許多不同的方法建立恢復目標。?
?
1.2.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.2.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?基于時間的恢復
這種恢復類型允許用戶將數據庫恢復到與指定時間一致的狀態。?當然,如果不存在能將數據庫還原到用戶請求的時間的有效備份或歸檔重做日志,Oracle?就會報RMAN-03002?和?RMAN-20207的錯誤。
必須具備在我們指定的恢復時間之前生成的數據庫備份,此外還需要所有歸檔的重做日志。
?
1.4?基于SCN?的恢復
Oracle?允許用戶將數據庫恢復到指定的SCN,實際上,這并不是一種常見的恢復方法。示例如下:
Startup?mount;
Restore?database?until?SCN?1000;
Recover?database?until?SCN?1000;
Alter?database?open?resetlogs;
?
注意:?該示例可以將數據庫還原到SCN?1000,但是不會包含SCN.
?
1.5?基于日志序列的恢復
RMAN?允許用戶將數據庫恢復到指定序列號的歸檔重做日志。如果歸檔的重做日志中存在間隙,使用這種恢復方法就非常方便。?間隙通常意味著我們只能將數據庫還原到間隙的開始點。?
Startup?mount;
Restore?database?until?sequence?100?thread?1;
Recover?database?until?sequence?100?thread?1;
Alter?database?open?resetlogs;
?
?
?
?
二.?基于RMAN?的恢復主題
?
2.1?只讀表空間的恢復
在默認情況下,即使丟失了只讀的數據文件,RMAN也不會在執行完全恢復數據庫還原操作時還原只讀的數據文件。?要在完全恢復期間還原只讀的數據文件,就必須在restore?命令中使用check?readonly?參數,如:
Restore?database?check?readonly;
?
注意,執行recover?tablespace或recover?datafile命令時,RMAN的工作情況是不一樣的。?使用這兩個命令時,不管表空間是否為只讀狀態都會執行恢復操作。
?
2.2?歸檔重做日志的還原
在使用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?也不會在這個新的位置上恢復歸檔的重做日志。
?
2.3?數據文件副本的還原
可以從數據文件副本(不是備份集)中還原數據庫的數據文件。?要實現這個功能,需要先使用restore?from?datafilecopy命令,然后再使用恢復數據庫(或表空間,數據文件)的recover。
RMAN>Restore?(datafile?5)?from?datafilecopy;??--?此處的圓括號是必須的,如果沒有就報錯
RMAN>Recover?datafile?5;
SQL>Alter?database?datafile?5?online;
?
執行restore?時,該命令會識別需要還原的數據文件的最新副本,然后從這個副本中還原這些數據文件。?數據文件的最新副本可能是在一個數據文件副本中,而不是在一個副本中。?在這種情況下,Oracle?會恢復這個數據文件副本。?
?
2.4?恢復訛誤的數據塊
即使與訛誤數據塊關聯的數據文件一直聯機,也可以通過用塊介質恢復(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.
?
?
2.5?恢復前一個對應物
一個數據庫的對應物(incarnation)對應這個數據庫的特定邏輯生存期。?有時我們需要使用上次執行resetlogs命令打開數據庫前生成的一個備份來還原數據庫,或者可能需要還原到執行上一個resetlogs命令之前的時間點。?這就需要用到incarnation.
?
2.5.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;
恢復管理器:?Release?11.2.0.1.0?-?Production?on?星期二?7月?6?10:31:40?2010
Copyright?(c)?1982,?2009,?Oracle?and/or?its?affiliates.??All?rights?reserved.
連接到目標數據庫:?ORCL?(DBID=1247395743)
連接到恢復目錄數據庫
RMAN>?list?incarnation;
數據庫原型列表
DB?關鍵字??Inc?關鍵字?DB?名??DB?ID????????????STATUS??重置?SCN??重置時間
-------?-------?--------?----------------?---?----------?----------
2???????12??????ORCL?????1250808537???????PARENT??1??????????30-8月?-05
2???????4???????ORCL?????1250808537???????PARENT??534907?????30-6月?-10
2???????323?????ORCL?????1250808537???????CURRENT?940996?????06-7月?-10
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;
?
2.5.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;
數據庫原型列表
DB?關鍵字??Inc?關鍵字?DB?名??DB?ID????????????STATUS??重置?SCN??重置時間
-------?-------?--------?----------------?---?----------?----------
1???????1???????ORCL?????1247395743???????PARENT??1??????????02-4月?-10
2???????2???????ORCL?????1247395743???????PARENT??940976?????21-5月?-10
3???????3???????ORCL?????1247395743???????ORPHAN??8426617????06-7月?-10
4???????4???????ORCL?????1247395743???????CURRENT?8554968????06-7月?-10
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')";
啟動?restore?于?06-7月?-10
使用通道?ORA_DISK_1
通道?ORA_DISK_1:?正在開始還原數據文件備份集
通道?ORA_DISK_1:?正在指定從備份集還原的數據文件
通道?ORA_DISK_1:?將數據文件?00001?還原到?D:/APP/ADMINISTRATOR/ORADATA/ORCL/SYSTEM01.DBF
通道?ORA_DISK_1:?將數據文件?00002?還原到?D:/APP/ADMINISTRATOR/ORADATA/ORCL/SYSAUX01.DBF
通道?ORA_DISK_1:?將數據文件?00003?還原到?D:/APP/ADMINISTRATOR/ORADATA/ORCL/UNDOTBS01.DBF
通道?ORA_DISK_1:?將數據文件?00004?還原到?D:/APP/ADMINISTRATOR/ORADATA/ORCL/USERS01.DBF
通道?ORA_DISK_1:?將數據文件?00005?還原到?D:/APP/ADMINISTRATOR/ORADATA/ORCL/DAVE0.DBF
通道?ORA_DISK_1:?正在讀取備份片段?F:/BACKUP/ORCL_1GLI2EN5_1_1.BAK
通道?ORA_DISK_1:?段句柄?=?F:/BACKUP/ORCL_1GLI2EN5_1_1.BAK?標記?=?TAG20100705T232732
通道?ORA_DISK_1:?已還原備份片段?1
通道?ORA_DISK_1:?還原完成,?用時:?00:01:45
完成?restore?于?06-7月?-10
RMAN>?recover?database?until?time?"to_date('2010-7-5?23:50:39','yyyy-mm-dd?hh24:mi:ss')";
啟動?recover?于?06-7月?-10
使用通道?ORA_DISK_1
正在開始介質的恢復
線程?1?序列?156?的歸檔日志已作為文件?D:/ARCHIVELOG/ORCL_1_156_719615012.ARC?存在于磁盤上
歸檔日志文件名=D:/ARCHIVELOG/ORCL_1_156_719615012.ARC?線程=1?序列=156
介質恢復完成,?用時:?00:00:02
完成?recover?于?06-7月?-10
RMAN>?alter?database?open?resetlogs;
數據庫已打開
RMAN>?list?incarnation;
數據庫原型列表
DB?關鍵字??Inc?關鍵字?DB?名??DB?ID????????????STATUS??重置?SCN??重置時間
-------?-------?--------?----------------?---?----------?----------
1???????1???????ORCL?????1247395743???????PARENT??1??????????02-4月?-10
2???????2???????ORCL?????1247395743???????PARENT??940976?????21-5月?-10
3???????3???????ORCL?????1247395743???????ORPHAN??8426617????06-7月?-10
4???????4???????ORCL?????1247395743???????CURRENT?8554968????06-7月?-10
?
注:?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
?
?
?
?
?
?
?
?
三.?表空間時間點恢復
表空間時間點恢復,TSPITR:?tablespace?point-in-time?recovery.???Oracle?官網文檔的連接地址:
RMAN?Tablespace?Point-in-Time?Recovery?(TSPITR)
http://download.oracle.com/docs/cd/B19306_01/backup.102/b14191/rcmtspit.htm
?
使用表空間時間點恢復(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):包含將要恢復的表空間
?
?
3.1?執行自動的TSPITR
?
3.1.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
?
3.1.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恢復之前清除所有舊的輔助實例,可以在執行該命令后進入輔助目標目錄,并刪除該目錄中的任何文件。
?
?
3.1.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?創建輔助實例。
?
?
3.2?手工執行TSPITR
Oracle?支持為TSPITR?創建自己的輔助實例。?也可以使用手工的TSPITR來完成失敗的自動TSPITR操作。?首先,依然是應用前面的準備階段中列出的步驟,接著必須準備輔助實例,然后執行TSPITR過程。
?
3.2.1?準備輔助實例
首先,需要啟動和運行輔助實例。輔助實例只是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.?
?
操作完成后,別忘了重新備份數據庫,及刪除輔助實例。
從上面的步驟來看,手工操作和自動步驟是一樣的,只不過手工將這些步驟分開了。
?
?
3.3?TSPITR的限制
TSPITR?有許多的限制:
(1)不能還原包含SYS用戶特有對象的表空間
(2)不能用TSPITR恢復含有復制主表的表空間
(3)不支持使用快照日志的表空間
(4)不能還原含有回滾段的表空間
(5)如果要恢復的表空間中的對象包含如下對象,則不支持:
Varray
嵌套表
外部文件
此外,TSPITR?不能用于恢復刪除的表空間,我們也不能恢復舊的對象統計表。
?
如果使用不含恢復目錄的RMAN,還會存在下面與TSPITR的限制:
(1)在要恢復的點和當前的點之間,目標數據庫中撤銷和回滾段的當前物理結構必須沒有變化。?回滾段在恢復期間不能發生變化。
(2)完成指定表空間的TSPITR后,這個表空間以前的所有備份就不能在用于以后的TSPITR。?這就是TSPITR后的表空間備份操作非常重要的原因,只有再次備份表空間后才能執行下一個TSPITR.
?
?
?
?
?
?
四.?驗證備份可恢復
如果備份不可恢復,那么它就沒有用處。?RMAN?提供了一種不需要還原數據庫就能檢查數據庫還原能力的方法,并且為用戶提供了幾個檢查選項。
?
4.1??restore?preview命令
該命令可以查看RMAN?使用哪個備份集來執行特定的恢復。?該命令將列出還原所需的備份集的詳細信息。
RMAN>?restore?database?preview;
啟動?restore?于?08-7月?-10
使用通道?ORA_DISK_1
備份集列表
===================
BS?關鍵字??類型?LV?大小???????設備類型?經過時間?完成時間
-------?----?--?----------?-----------?------------?----------
7???????Full????987.05M????DISK????????00:01:40?????08-7月?-10
????????BP?關鍵字:?7???狀態:?AVAILABLE??已壓縮:?NO??標記:?TAG20100708T161959
段名:F:/BACKUP/BL_07LI9IPG_1_1.BAK
??備份集?7?中的數據文件列表
??文件?LV?類型?Ckp?SCN????Ckp?時間???名稱
??----?--?----?----------?----------?----
??1???????Full?1041819????08-7月?-10?D:/APP/ADMINISTRATOR/ORADATA/BL/SYSTEM01.DBF
??2???????Full?1041819????08-7月?-10?D:/APP/ADMINISTRATOR/ORADATA/BL/SYSAUX01.DBF
??3???????Full?1041819????08-7月?-10?D:/APP/ADMINISTRATOR/ORADATA/BL/UNDOTBS01.DBF
??4???????Full?1041819????08-7月?-10?D:/APP/ADMINISTRATOR/ORADATA/BL/USERS01.DBF
??5???????Full?1041819????08-7月?-10?D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF
?
db_unique_name?為?BL?的數據庫的歸檔日志副本列表
=====================================================================
關鍵字?????線程序列?????S?時間下限
-------?----?-------?-?----------
8???????1????12??????A?08-7月?-10
????????名稱:?D:/ARCHIVELOG/BL_ARC0000000012_0723658881.0001
9???????1????13??????A?08-7月?-10
????????名稱:?D:/ARCHIVELOG/BL_ARC0000000013_0723658881.0001
介質恢復啟動?SCN?是?1041819
恢復范圍必須超出?SCN?1041819?才能清除數據文件模糊性
完成?restore?于?08-7月?-10
?
4.2?用verify?和?check?logical參數的restore?命令
Restore?命令提供一些驗證數據庫可恢復和備份有效的選項。?首先,可以使用backup命令的validate參數使RMAN?檢查備份,以確定數據庫是可恢復的。?使用validate選項時,Oracle會檢查用于恢復數據庫的最新備份集以確定這個備份集是完整的,還會檢查操作需要使用的所有數據文件副本和歸檔的重做日志備份集,并確定他們也是完整的。?此外,validate?選項會對備份集執行全面的驗證操作,以確保這些備份的完整性。?驗證操作的時間不會太長,并且這是確保數據庫可恢復的一種方法。
RMAN>?restore?database?validate;
啟動?restore?于?08-7月?-10
使用通道?ORA_DISK_1
通道?ORA_DISK_1:?正在開始驗證數據文件備份集
通道?ORA_DISK_1:?正在讀取備份片段?F:/BACKUP/BL_07LI9IPG_1_1.BAK
通道?ORA_DISK_1:?段句柄?=?F:/BACKUP/BL_07LI9IPG_1_1.BAK?標記?=?TAG20100708T161959
通道?ORA_DISK_1:?已還原備份片段?1
通道?ORA_DISK_1:?驗證完成,?用時:?00:00:26
完成?restore?于?08-7月?-10
?
此外,使用restore?命令的check?logical?參數能夠更完全地檢查最新備份集。?這個命令使RMAN檢查數據庫的備份,如果這些備份通過物理訛誤檢查,還要檢查備份的數據和索引段中是否存在邏輯訛誤。?如果發現邏輯訛誤,Oracle?會采用下面的一種方法來響應錯誤:
(1)?如果設置了maxcorrupt參數,并且還原檢查邏輯操作期間的訛誤數沒有超過這個參數值,RMAN就會在Oracle?的v$database_block_corruption?視圖中填充訛誤的數據塊列表。
(2)?如果還原檢查邏輯操作期間的訛誤數超過了maxcorrupt參數值,操作就會終止。
?
在默認情況下,maxcorrupt?參數被設置為0,因此任何邏輯訛誤都會導致檢查操作的失敗。?通過set?命令可以修改默認的maxcorrupt參數值,但只能在run代碼塊的范圍內使用這條命令。?此外,maxcorrupt參數是為每個數據文件單獨設置的,而不是為所有的數據文件設置。
?
RMAN>?run
2>?{
3>?set?maxcorrupt?for?datafile?1,2,3?to?10;???--?將1,2,3datafile?的maxcorrupt?設為10
4>?restore?database?check?logical?validate;
5>?}
?
正在執行命令:?SET?MAX?CORRUPT
?
啟動?restore?于?08-7月?-10
使用通道?ORA_DISK_1
?
通道?ORA_DISK_1:?正在開始驗證數據文件備份集
通道?ORA_DISK_1:?正在讀取備份片段?F:/BACKUP/BL_07LI9IPG_1_1.BAK
通道?ORA_DISK_1:?段句柄?=?F:/BACKUP/BL_07LI9IPG_1_1.BAK?標記?=?TAG20100708T161959
通道?ORA_DISK_1:?已還原備份片段?1
通道?ORA_DISK_1:?驗證完成,?用時:?00:00:27
完成?restore?于?08-7月?-10
?
?
4.3?使用validate?backupset?命令
使用具有validate參數或者check?logical?參數的restore?命令只能檢查最新的備份集,如果我們要檢查任意的備份集,就需要使用validate?backupset命令。?使用這條命令前,必須首先確定要檢查的備份集鍵(backup?set?key)。?每個備份集在生成時都會被指派一個稱為備份集鍵的唯一標識符。?
?
RMAN>?list?backupset?;
備份集列表
===================
BS?關鍵字??大小???????設備類型占用時間?完成時間
-------?----------?-----------?------------?----------
1???????52.15M?????DISK????????00:00:04?????07-7月?-10
????????BP?關鍵字:?1???狀態:?AVAILABLE??已壓縮:?NO??標記:?TAG20100707T200948
段名:F:/BACKUP/BL_01LI7BSC_1_1.BAK
?
??備份集?1?中的已存檔日志列表
??線程序列?????低?SCN????時間下限???下一個?SCN???下一次
??----?-------?----------?----------?----------?---------
??1????5???????986340?????06-7月?-10?1006590????07-7月?-10
??1????6???????1006590????07-7月?-10?1008501????07-7月?-10
?
BS?關鍵字??類型?LV?大小???????設備類型?經過時間?完成時間
-------?----?--?----------?-----------?------------?----------
2???????Full????974.46M????DISK????????00:01:33?????07-7月?-10
????????BP?關鍵字:?2???狀態:?AVAILABLE??已壓縮:?NO??標記:?TAG20100707T200956
段名:F:/BACKUP/BL_02LI7BSK_1_1.BAK
??備份集?2?中的數據文件列表
??文件?LV?類型?Ckp?SCN????Ckp?時間???名稱
??----?--?----?----------?----------?----
??1???????Full?1008510????07-7月?-10?D:/APP/ADMINISTRATOR/ORADATA/BL/SYSTEM01.DBF
??2???????Full?1008510????07-7月?-10?D:/APP/ADMINISTRATOR/ORADATA/BL/SYSAUX01.DBF
??3???????Full?1008510????07-7月?-10?D:/APP/ADMINISTRATOR/ORADATA/BL/UNDOTBS01.DBF
??4???????Full?1008510????07-7月?-10?D:/APP/ADMINISTRATOR/ORADATA/BL/USERS01.DBF
??5???????Full?1008510????07-7月?-10
?
根據上面查出來的backup?set?key,來驗證:
RMAN>?validate?backupset?1;
啟動?validate?于?08-7月?-10
使用通道?ORA_DISK_1
通道?ORA_DISK_1:?正在開始驗證歸檔日志備份集
通道?ORA_DISK_1:?正在讀取備份片段?F:/BACKUP/BL_01LI7BSC_1_1.BAK
通道?ORA_DISK_1:?段句柄?=?F:/BACKUP/BL_01LI7BSC_1_1.BAK?標記?=?TAG20100707T200948
通道?ORA_DISK_1:?已還原備份片段?1
通道?ORA_DISK_1:?驗證完成,?用時:?00:00:05
完成?validate?于?08-7月?-10
?
RMAN>?validate?backupset?1?check?logical;
啟動?validate?于?08-7月?-10
使用通道?ORA_DISK_1
通道?ORA_DISK_1:?正在開始驗證歸檔日志備份集
通道?ORA_DISK_1:?正在讀取備份片段?F:/BACKUP/BL_01LI7BSC_1_1.BAK
通道?ORA_DISK_1:?段句柄?=?F:/BACKUP/BL_01LI7BSC_1_1.BAK?標記?=?TAG20100707T200948
通道?ORA_DISK_1:?已還原備份片段?1
通道?ORA_DISK_1:?驗證完成,?用時:?00:00:03
完成?validate?于?08-7月?-10
?
?
?
?
五.?跨平臺的數據庫移動和RMAN
Oracle?10g?R2支持手工跨平臺移動數據庫,即使這些平臺具有不同的尾數格式(endian?format)。?尾數格式與字節排序有關,它有兩種不同的格式,即大尾數和小尾數。?如果在不同尾數字節格式的平臺之間移動數據庫,就需要手工操作,并且使用RMAN的convert?datafile?或者?convert?tablespace命令來將傳送的數據文件轉換為正確的尾數格式。
?
5.1?可跨平臺傳送的表空間
Oracle?支持幾乎(不是所有)Oracle?數據庫家族的所有平臺之間的表空間移動。該功能具有如下的一些優點:
(1)?在不同的內容提供者之間有效地發布數據
(2)?在不同數據倉庫,數據集和OLTP?系統之間輕松地轉移數據。
(3)?輕松地跨平臺遷移數據庫
?
為了能夠在平臺之間移動表空間,必須將compatible?設置為10.0.0?或更高的值。?設置該參數后,在下一次啟動操作時,表空間數據文件將被設置為支持跨平臺操作。?注意的是:?只有在設置為可讀寫或聯機時,只讀文件和脫機數據文件才可支持跨平臺操作。
?
5.2?字節排序和數據文件轉換
?
5.2.1?數據文件排序
Oracle?平臺一般使用兩種不同的字節排序方法(稱為:尾數格式)。?如果多個平臺使用相同的字節排序方案,則可以采用以前的常用方法傳送表空間,而不會產生任何問題。
如果字節排序方案不同,則需要在RMAN中使用convert?命令來將表空間轉換為目標平臺上所需的格式。?可以通過連接動態視圖v$database和新的v$transportable_platform?視圖來確定尾數格式:
SQL>?select?endian_format?from?v$transportable_platform?tp,?v$database?d?where?tp.platform_name=d.platform_name;
ENDIAN_FORMAT
--------------
Little
?
該示例中,當前系統使用的是小尾數格式。?因此,如果在兩個系統上的查詢返回相同的結果,則表示有兼容的數據文件格式;如果返回不同的結果,則需要使用RMAN和compatible?參數來傳送表空間。
?
5.2.2?使用RMAN?轉換表空間尾數格式
如果需要轉換另一個平臺的表空間,則可以使用RMAN。?
?
(1)轉換表空間:?
先將表空間轉換為只讀模式:
SQL>?alter?tablespace?BL?read?only;
表空間已更改。
RMAN>?convert?tablespace?BL?to?platform='AIX-Based?Systems?(64-bit)'?
db_file_name_convert='D:/APP/ADMINISTRATOR/ORADATA/BL','F:/bl';
?
啟動?conversion?at?source?于?08-7月?-10
使用通道?ORA_DISK_1
通道?ORA_DISK_1:?啟動數據文件轉換
輸入數據文件:?文件號=00005?名稱=D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF
已轉換的數據文件?=?F:/BL/BL01.DBF
通道?ORA_DISK_1:?數據文件轉換完畢,?經過時間:?00:00:07
完成?conversion?at?source?于?08-7月?-10
?
啟動?Control?File?and?SPFILE?Autobackup?于?08-7月?-10
段?handle=D:/APP/ADMINISTRATOR/FLASH_RECOVERY_AREA/BL/AUTOBACKUP/2010_07_08/O1_M
F_S_723857700_63CW16C1_.BKP?comment=NONE
完成?Control?File?and?SPFILE?Autobackup?于?08-7月?-10
?
說明,在這個實驗中,我們發現它備份了控制文件和spfile文件,這也說明了以前的一個觀點,當數據文件發生變化時,在開啟自動備份的前提下,會自動備份這2個文件。
?
(2)?轉換數據文件
RMAN>?convert?datafile?'D:/APP/ADMINISTRATOR/ORADATA/BL/BL01.DBF'?from?platform
'AIX-Based?Systems?(64-bit)'?db_file_name_convert?'D:/APP/ADMINISTRATOR/ORADATA/
BL','F:/bl';
?
有關?CONVERT?DATAFILE?or?TABLESPACE,參考聯機文檔
http://www.di.unipi.it/~ghelli/didattica/bdldoc/B19306_01/backup.102/b14191/dbxptrn001.htm
?
使用平臺名來自v$transportable_platform視圖的platform_name列。?Oracle?對于放入正確的名稱有嚴格的要求。
一旦完成了轉換,就可以用下面的方式完成移動,使用可傳送表空間手工移動數據文件或表空間。?注意的是,如果尾數格式不同,RMAN?就不能完成操作。尾數相同的可以按下面方法操作。
SQL>?select?*?from?v$transportable_platform;
PLATFORM_ID?PLATFORM_NAME
-----------?----------------------------------------
??????????1?Solaris[tm]?OE?(32-bit)
??????????2?Solaris[tm]?OE?(64-bit)
??????????7?Microsoft?Windows?IA?(32-bit)
?????????10?Linux?IA?(32-bit)
??????????6?AIX-Based?Systems?(64-bit)
??????????3?HP-UX?(64-bit)
?
?
5.3?跨平臺移動數據庫
Oracle?10g?提供了全新的功能處理在尾數格式相同的平臺之間移動數據庫。Convert?database命令結合DBMS_TDP程序包可以減少在平臺之間移動數據庫的整體工作量。?該過程包括如下步驟:
?
5.3.1?以只讀方式打開數據庫
Start?mount;
Alter?database?open?read?only;
?
5.3.2?使用dbms_tdp.check_db?過程來檢查數據庫狀態。?
Set?serveroutput?on
Declare?
Db_ready?boolean;
Begin
Db_ready?:=?dbms_tdb.check_db
('Microsoft?Windows?IA?(32-bit)',dbms_tdb.skip_readonly);
End;
/
?
5.3.3?使用dbms_tdb.check_external?過程來標識外部對象:
Set?serveroutput?on
Declare
External?boolean;
Begin
External?:=?dbms_tdb.check_external;
End;
/
?
5.3.4?當數據庫主備好傳送時,就可以使用RMAN?的convert?database命令。?RMAN?創建數據庫移動所需要的腳本,但不實際執行移動,而是創建移動所需要的文件。
Convert?database?new?database??'copy'?transport?scripts?'c:/oracle/copyscripts'?to?platform?'Microsoft?Windows?IA?(32-bit)';
?
一旦完成該命令,只需遵循RMAN?提供的指令就可以在目標數據庫上完成轉換。
?
?
?
轉載于:https://www.cnblogs.com/Peyton-for-2012/archive/2012/11/22/2782338.html
總結
以上是生活随笔為你收集整理的【转】RMAN 高级恢复的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通用Login功能自动化测试
- 下一篇: ExtJs开发总结