19.Oracle10g服務器管理恢復--RMAN表空間恢復(練習33)
在練習12-14中我們學習了如何將數據庫中刪除的表恢復到錯誤發生之前,而不需要恢復整個數據庫。Oracle可以恢復數據庫的一個表空間,此時還原表空間數據文件,然后應用歸檔日志文件直到失效前或錯誤發生處。下面使用Oracle可遷移表空間功能將需要恢復對象的表空間遷移到主數據庫,這種形式稱為表空間時間點恢復(TSPITR)。
在前面的練習中我們也學習如何用RMAN方便地進行恢復任務,只需要幾個命令就可以創建副本數據庫,而副本數據庫的創建也非常簡單。RMAN也可以用來處理TSPITR,其工作比手工完成方便得多。如果對主數據庫只進行了RMAN備份,則只能用RMAN還原和恢復工作。如果兼有用戶管理的備份、導出和RMAN備份,則應用RMAN依然快捷、簡單。
TSPITR優點就是可以一個或多個表空間恢復到以前的狀態,而保持數據庫其他部分的現狀。不過恢復部分和數據庫其余部分之間存在整體邏輯數據庫關系時,TSPITR不太方便。如果數據關系是由某個應用程序管理而不是應用數據庫的完整性,則需要確保所有相關的數據對象按順序恢復。表空間中的不一致數據將引起許多問題,如果相關數據分散在大量的表空間中,則必須增加期望恢復的表空間以確保包括了所有相關的對象。
和以前的練習一樣需要定義應用的術語,這些術語在練習12-14已經討論過,這里有必要再次介紹:
- 輔助實例(Auxiliary instance):用于恢復特定表空間的后臺進程和內存結構,該實例將打開輔助數據庫;
- 輔助數據庫(Auxiliary database):主數據庫的一個副本或子集,用于表空間的臨時恢復。在本練習中,AUXY實例將打開一個名為PRACTICE數據庫,該數據庫來自PRACTICE主數據庫的數據文件和控制文件的一個還原備份;
- 主數據庫(Primary database):需要TSPITR的數據庫,該數據庫中的USERS表空間將恢復到與數據庫中其他表空間不同的某一個時間點;
- 恢復集(Recovery set):構成恢復到某一個時間點表空間的數據文件,SYSTEM表空間數據文件不能作為恢復集的一部分,在本節中,恢復集是USERS表空間內的兩個備份數據文件;
- 輔助集(Auxiliary set):表空間恢復所需要的全部數據文件。在本節中,恢復集是PRACTICE數據庫的備份控制文件,SYSTEM和UNDOTBS01表空間的備份數據文件、輔助數據庫參數文件以及PRACTICE主數據庫的歸檔日志文件。
在TSPITR期間,RMAN將完成一系列的任務,當連接到目標、輔助和可選的目錄數據庫時,RMAN將進行以下任務:
- 根據最近進行的備份或提供的恢復停止點來確定還原需要的數據庫子集需要哪些基本的備份;
- 從RMAN備份為輔助數據庫創建一個新的控制文件;
- 根據輔助數據庫參數或RMAN設置名命令和選項來確定數據文件的存儲位置;
- 從第1)步確定的備份片或映像拷貝還原數據文件,這個功能與RMAN通常執行數據庫還原是一樣的,只有恢復集和輔助集中的文件才被還原與恢復;
- 根據恢復停止點向還原的數據文件應用所有的增量備份,這個工作與在RMAN中發布恢復數據庫命令是一樣的;
- 基于恢復停止點向還原的數據文件應用所有來自磁盤或備份的歸檔日志文件,與采用RMAN進行正常恢復一樣,歸檔對象最后被應用到還原的數據庫上;
- 當重新設置聯機重做日志文件時,打開輔助數據庫。這個新的聯機重做日志文件將根據從輔助參數文件翻譯的內容創建;
- 用可遷移表空間特性導出屬于恢復的(不是輔助)表空間的數據字典原數據庫,并關閉輔助數據庫;
- 將恢復的表空間中數據文件的位置切換到目標控制文件中新數據文件的位置;
- 將恢復的表空間的數據字典元數據導入到主/目標數據庫中。
在TSPITR結束時,恢復的表空間是脫機的,保持脫機狀態是為了提醒大家注意,需要備份這些表空間,一旦表空間參與到TSPITR中,則在TSPITR期間,以前的備份和歸檔日志文件都不能用于恢復該表空間。新的備份將為將來的恢復提供新的基準。
當考慮RMAN TSPITR時,應該注意Oracle文檔中提到的幾個條件,列舉如下,其中有限制條件與用戶管理的TSPITR一樣:
- 輔助數據庫和主數據庫必須駐留在同一機器上,如果機器缺少磁盤空間或者其他資源,則這個限制將會導致嚴重的問題;
- 運行沒有目錄的TSPITR也有許多限制,類似于其他RMAN恢復情況,可以只還原和恢復存儲在目標數據庫控制文件中的數據文件,如果值配置了數據庫存儲7天的RMAN備份信息,則不可能恢復21天前有沒有進行更新的備份的表空間;
- 不能恢復已經刪除的表空間,不能恢復已經刪除但又用同樣的表空間名還原的表空間;
- 不能在輔助數據庫上進行數據庫更改,輔助數據庫只具有臨時功能;
- 在恢復集中不能包括下面這些對象:副本主表、帶有VARRAY列的表、包含嵌套表的表、包含外部文件的表、快照日志、快照表、SYSTEM的對象和回退段。
在本練習中,用RMAN執行在練習12-14中進行的用戶管理恢復練習,因為兩者之間的差別比較明顯所以這樣的操作很有幫助,而且還可以強化以前所學的內容,因此在進行本練習之前應復習這兩個練習。
恢復管理器的TSPITR
- 創建主數據庫的RMAN備份 為了用RMAN執行TSPITR,RMAN需要一個合適的用于RMAN向輔助服務器上還原的備份。這個備份可以在數據庫打開、關閉時生成,并且可以是映像拷貝、代理拷貝或備份;
- 備份配置備用數據庫的參數文件 必須為輔助數據庫創建數據庫初始化參數,備用數據庫需要的許多參數都與Oracle進行自動命名文件和日志文件有關。這可以在數據文件需要遷移到其他位置時,防止覆蓋文件和人工干涉。重要的參數包括lock_name_space(用于同一機器上相同的數據庫名為一個實例創建一個唯一的內存空間)、db_file_name_convert、log_file_name_convert(自動重新定位數據庫文件和日志文件)。
- 配置備用數據庫的口令文件 為了DBA身份認證,輔助數據庫需要一個口令文件;
- 配置NET8的配置文件 RMAN需要同時連接主數據庫和輔助數據庫。其中一個連接可以由ORACLE_SID環境變量定義為本地,而另一個則必須通過NET8連接;
- 啟動輔助數據庫實例 RMAN在輔助數據庫上執行TSPITR之前,輔助實例必須以非加載模式啟動,讀取第2)步中建立的參數文件;
- 打開主數據庫 RMAN需要在TSPITR之間打開目標數據庫,導入的恢復集字典數據需要目標數據庫打開;
- 連接目標、輔助和可選目錄數據庫時激活TSPITR 當連接到輔助實例, RMAN將執行TSPITR。為輔助實例分配磁盤通道并為恢復設置停止點,指定需要恢復的表空間,然后RMAN執行剩下的任務。
RMAN選擇最合適的基準備份用來還原,然后再計算需要什么樣的增量和歸檔重做日志。因為正在進行不完全恢復,所以當完成輔助數據庫備份后,RMAN將自動以RESETLOGS模式打開輔助數據庫,同時輔助數據庫需要重新生成日志文件。一旦打開輔助數據庫,RMAN將導出包含在恢復表空間中所有對象的元數據。同樣地,當以手工方式從一個數據庫向另一個數據庫傳送表空間時,數據將以同樣的方式導出。當導出元數據后,輔助數據庫就關閉了,而目標數據庫的控制文件就修改到新的數據文件剛恢復的位置,這些都是用RMAN切換命令自動完成的。最后,元數據導入到主數據庫,而表空間仍然處于脫機狀態。此時對這些表空間進行備份非常重要,因為在TSPITR期間這些以前表空間備份將不能用于前滾數據庫。進行備份后將表空間聯機,這些表空間就可以使用了。
練習33:表空間時間點恢復
在這個練習中,目標數據庫是PRACTICE,輔助數據庫是AUXY。下面的步驟是在錯誤地刪除一個表后,成功地恢復一個表空間。接著要在刪除命令之前、之后修改對象,以便顯示表空間的恢復如何影響其他對象。一旦恢復完成,就可以證實刪除的表已經恢復,而其他的表空間數據保持不變,為了使情況更簡單些,這里選擇自包含的表空間,所以練習中不進行對象依賴性檢查。
步驟一:刪除表SCOTT.EMP
刪除SCOTT的employee表,這次使用TSPITR恢復該表,在刪除表之前標記時間,稍后將把用戶表空間恢復到這個時間,SCOTT的employee表和包含在這個表空間的其他對象都將恢復。
2 SQL>SET TIME ON
3 17:05:57 SQL>DELETE FROM tina.date_log WHERE create_date>SYSDATE;
4 17:06:01 SQL>DROP TABLE SCOTT.EMP;
5 17:06:08 SQL>SET TIME OFF

(圖2)
可以看出刪除表發生在17:06:01,在這個練習發生時間是2010-12-24。在對AUXY實例的TSPITR步驟三中再次使用該時間,為了確認TSPITR按要求進行工作,在刪除表命令以后為USERS表空間創建一個對象。同時在USERS表空間中的一個表中插入一行記錄,最后在USERS以外其他表空間的一個表中插入一行記錄。
2 SELECT * FROM scott.dept;
3 SQL>INSERT INTO scott.dept(deptno, dname, loc)
4 VALUES ('50', 'SUPPORT', 'DEVER');
5 SQL>INSERT INTO tina.date_log VALUES (SYSDATE+365*17);
6 SQL>COMMIT;
7 SQL>ALTER SYSTEM SWITCH LOGFILE;

(圖4)
執行完TSPITR之后,主數據庫PRACTICE的USERS表空間將沒有SCOTT.DEPT_COPY表。因為TSPITR之后USERS表空間的任何數據更改都不能恢復,所以department表中沒有support部門。最后TINA.DATE_LOG中的數據在TSPITR之后將保持不變,應該在TSPITR之后看到一個未來17年的日期記錄,還將發現沒有恢復的表空間沒有丟失任何數據或對象。如果沒有恢復的表空間中的對象與恢復的表空間中的對象(例如索引、觸發器和約束)有直接的聯系,那么它將受到影響。最后,切換日志文件使所有這些對PRACTICE數據庫進行的更改都記錄到歸檔日志文件中。
步驟二:準備輔助數據庫
準備名為AUXY的輔助數據庫,與練習31準備類似,不同的是對所有的路徑、參數和文件名應用AUXY而不是STBY。
- 路徑 生成所有的管理目錄D:\oracle\product\10.1.0\admin\AUXY和數據庫目錄D:\oracleAUXY;
- 參數文件 用PRACTICE數據庫的拷貝創建一個參數文件,并命名為D:\oracle\product\10.1.0\admin\AUXY\\pfile\initAUXY.ORA。增加這些參數將所有PRACTICE修改為AUXY(除了DB_NAME);
1 db_file_name_convert={"PRACTICE","AUXY"}
2 log_file_name_convert={"PRACTICE","AUXY"}
3 lock_name_space="AUXY"
- 口令文件 為備份數據庫創建一個口令文件,使RMAN可以用SYSDBA連接到AUXY數據庫;
- Window服務 在Window系統中,用oradmin工具為AUXY數據庫創建一個名為OracleServiceAUXY的數據庫服務;
- 配置Net8 最后為AUXY配置Net8連接,這一步對于練習10-11是不必要的。因為不需要同時連接到AUXY實例和PRACTICE數據庫,使用Net8 Assistant為AUXY數據庫增加一個數據庫服務,并為AUXY數據庫配置監聽器。另外非常注意,設置完畢后需要重啟監聽并把數據庫處于非加載模式。
步驟三:執行RMAN TSPITR
最后需要將SCOTT的employee表返回,引導RMAN在USERS表空間執行TSPITR。實際命令非常簡短,如下所示:
2 connect catalog rman1010/rman@rcat
3 connect auxiliary sys/auxy@auxy
4 run{
5 set command id to 'Perorming TSPIR';
6 allocate auxiliary channel d1 type disk;
7 recover tablespace users
8 until time "TO_DATE('2010-12-24 17:06:01', 'yyyy-MM-dd HH24:mi:ss')"
9 auxiliary destination 'D:\oracle\AUXY';
10 }
這個腳本打開一個目標數據庫(PRACTICE)、目錄數據庫(RCAT)和輔助數據庫(AUXY)的連接。為輔助實例分配了一個通道并將V$SESSION.CLINT_INFO動態視圖列更新為”Performing TSPITR”,然后只需一個恢復表空間的命令RMAN就可以執行了。
運行該腳本并在跟蹤文件中檢查輸出:
2 RMAN>@D:\oracle\CODE\chap17\tspitr.rcv
首先應該明確,RMAN向輔助數據庫重建與恢復數據庫的一個子集,一旦輔助數據庫恢復了,則將回傳恢復集表空間到目標數據庫。

第一個生成的文件就是輔助數據庫的控制文件,PRACTICE數據庫控制文件的一個備份在輔助參數文件指定的位置還原。在輸出信息中顯示控制文件還原所在的備份片,注意RMAN從PRACTICE數據庫的備份創建了輔助實例,而不是數據庫本身。
為了恢復USERS表空間,RMAN知道它在表空間的恢復集中必須要還原的數據文件,并還原隨后所需的表空間和數據文件。Users01.dbf和Users02.dbf屬于USERS表空間,必須被還原,在本實例中,這兩個數據文件是組成恢復集的兩個數據文件。System01.dbf和UNDOTBS01.dbf也必須被還原(本例中組成了輔助數據集)。


這些命令將恢復需要回傳USERS表空間到目標PRACTICE數據庫的輔助數據庫中的表空間。這些命令不是恢復命令,它們是由RMAN在內存中為將要進行恢復而生成的。因此RMAN將生成要求完成工作的運行腳本,恢復之后,輔助數據庫必須打開,這樣USERS表空間才能導出自己的字典元數據。

RMAN的這些數據顯示實際上還原基本備份。注意,輔助數據文件保存在D:\oracle\AUXY目錄下,但是恢復集數據文件拷貝到目標數據庫文件的位置。目標數據庫的USERS表空間在還原數據文件之前是脫機狀態。

還原之后,輔助數據庫中的脫機表空間恢復到停止點。增量備份也應用到還原的數據文件上,然后根據歸檔日志文件對輔助數據庫重做。完成恢復之后,數據庫打開,準備導出:

RMAN生成export/import命令,從AUXY數據庫向PRACTICE數據庫傳輸新的恢復USERS表空間。
如果該腳本運行成功而沒有錯誤,TSPITR就成功了。在TSPITR之后,輔助數據庫(AUXY)被關閉,目標數據庫(PRACTICE)已打開,而恢復的表空間(USERS)則脫機。
步驟四:確認恢復
為了確認USERS表空間按要求恢復,可以將USERS表空間聯機后檢查數據庫中表的狀態。
- 類似于SCOTT.EMP表被刪除之前的操作,檢查USERS表空間中的對象和數據庫情況;
- 查看SCOTT.EMP表存在而SCOTT.DEPT_COPY不存在;
- 檢查是否可以在SCOTT.DEPT表中找到SUPPORT記錄;
- 確認沒有DEPT_COPY表或者SCOTT.DEPT表中沒有SUPPORT記錄;
- 檢查USERS表空間恢復之后其他表空間包含的數據;
- 檢查TINA.DATE_LOG表中是否插入一個未來17年日期的記錄。
所有這些檢查可以用以下SQL執行:
2 SQL>ALTER TABLESPACE USERS ONLINE;
3 SQL>describe scott.emp;
4 SQL>describe scott.dept_copy;
5 SQL>SELECt * FROM scott.dept;
6 SQL>SELECt max(create_date) FrOM tina.date_log;

(圖18)
步驟五:TSPITR之后的清理
一旦完成TSPITR則必須備份主數據庫的數據文件,不能使用TSPITR之前的數據文件備份來恢復表空間,因為來自該備份的歸檔日志與新恢復的表空間不對應。盡管整體數據庫備份可以保護新恢復的USERS表空間,但可以用以下命令備份一個表空間:
2 allocate channel d1 type disk;
3 backup tablespace USERS
4 format 'D:\oracle\CODE\chap17\db_%d_%s_%p_%t';
5 }
最后一件事:不再需要在磁盤上保存輔助數據庫文件。這些文件已經完成了使命,所以可以從D:\oracle\AUXY目錄中刪除。這樣可以刪除數據文件、控制文件、重做日志文件和RMAN進行TSPITR時需要的臨時文件,也可以刪除為輔助實例創建的數據庫初始化文件、口令文件和其他路徑。
1.1.3. 小結
對比練習12-14,用戶管理的TSPITR與本章中的服務器管理的TSPITR相比需要更多的工作。盡管用戶管理和服務器管理的TSPITR都需要建立數據庫路徑和相應的支撐文件以及用于數據庫生成的備份,但RMAN卻完成了大多數數據庫的工作。下表總結了用戶管理和服務器管理TSPITR的差別:
|
用戶管理TSPITR |
服務器管理TSPITR |
|
配置備用數據庫(路徑、參數文件、口令文件、Window服務);Net8配置可選 |
配置備用數據庫(路徑、參數文件、口令文件、Window服務);Net8配置可選 |
|
采用用戶管理備份主數據庫打開或關閉備份,備份需要與所有數據文件一樣大的磁盤或磁帶空間 |
采用服務器管理備份目標數據庫打開、關閉或映像拷貝。備份需要的磁盤或磁帶空間比所有的數據庫文件的空間小。映像拷貝需要與所有文件一樣的磁盤或磁帶空間 |
|
通過操作系統的命令刪除備份文件 |
還原輔助數據庫數據文件 |
|
在輔助數據庫位置上創建控制文件的拷貝文件備份 |
在輔助控制文件的位置上還原控制 |
|
執行手工不完全恢復并RESETLOGS打開Export/Import恢復表空間 |
執行手工不完全恢復并已RESETLOGS打開處理恢復集表空間的導入/導出 |
|
為恢復的數據文件重新命名或在操作系統拷貝文件 |
切換目標數據庫使用恢復的數據文件 |
|
在TSPITR之前從主數據庫中刪除恢復的表空間 |
切換數據文件而不需要刪除表空間 |
|
目標和輔助數據庫可以保存在不同的服務器上 |
目標和輔助數據庫必須保存在同一服務器上 |

浙公網安備 33010602011771號