RMAN 系列(一)---- RMAN 體系結構概述

一. 服務器管理恢復

恢復管理器, Recovery Manager, 簡陳 RMAN。 RMAN 實現一直服務器管理恢復(Server Managed Recovery: SMR)。 SMR 是一種數據庫執行所需要的操作以確保自身備份成功的能力,依賴於Oracle RDBMS 內核中的內置代碼可以完成這一功能。 SMR 的功能主要體現在能夠減少用戶的操作。

二. RMAN 使用程序

RMAN 是SMR的具體實現,它是Oracle 提供的,RMAN 是一個獨立的應用程序,它負責建立到Oracle 數據庫的客戶端連接,以訪問數據庫內部的備份和恢復數據包。RMAN 的核心命令是解釋程序,命令解釋程序接受所輸入的命令,並將這些命令轉換爲在數據庫上執行的遠程調用(Remote Procedure call: RPC.

要強調的事,RMAN 只是做少量的工作。雖然時間的協調非常重要,但是備份和恢復一個數據庫的具體工作實際上是由目標數據庫上的進程完成的,目標數據庫(target database)指的是要備份的數據庫。Oracle 數據庫的內部數據包可以將RMAN 中的PL/SQL 塊變成系統調用,這些調用即可以寫入數據庫服務器的磁盤系統,也可以讀取數據庫服務器的磁盤子系統。

RMAN 實用程序是Database Utilities的一部分Database Utilities是一組命令行形式的使用程序,包括Importexportsql*loader和 dbverify。 典型的安裝Oracle 時會自動安裝RMANRMAN 分企業版和標準版2種,如果只能使用標準版的RMAN,那麼RMAN 就只能分配一個通道。

RMAN 實用由兩部分組成,可執行文件和recover.bsq 文件。 Recover.bsq 文件實質上是庫文件可執行文件從recover.bsq 文件中析取代碼來創建在目標數據庫上執行的PL/SQL 調用Recover.bsq 文件是整個操作的中樞。這個文件始終保持鏈接,並在邏輯上構成RMAN 客戶端使用程序。要注意的是: recover.bsq 文件和 可執行文件的版本必須是相同,否則不能正常工作。

RMAN 實用程序有一種獨特的,有序的,可預測的用法:解釋在目標數據庫上遠程執行的PL/SQL 調用中的命令。 RMAN 實用程序完成了我們需要做的所有備份,還原,恢復和處理備份工作。由可執行解釋程序負責解釋這些程序命令,並基於用戶的請求收集信息。 如果要求I/O 操作(即一條備份命令或一條還原命令),RMAN 會在返回信息時準備另一個過程塊,並將這個過程塊傳遞迴目標數據庫。這些過程負責執行OS的系統調用以進行指定的讀或寫操作。

RMAN 與數據庫權限

RMAN 需要訪問目標數據庫上sys模式中存在的各種數據包,還需要具有啓動和關閉目標數據庫的權限。 因此RMAN 通常以sysdba 用戶身份連接到目標數據庫。 如果以不具有sysdba 權限的用戶連接到目標數據庫,RMAN 會報ORA-01031: insufficient privileges 錯誤。 

在一般情況下,大多數Unix 系統中都有一個Oracle 用戶,它是dba組的一個成員。 這是最初安裝Oracle 軟件的用戶,如果以Oracle 用戶登錄,在RMAN 中以什麼身份連接就變的不重要,它將總是作爲sysdba 互用來連接目標數據庫,並且能夠訪問sys 模式,同時也具有啓動和關閉數據庫的能力。 在windows 平臺上,Oracle 會創建一個ORA_DBA本地組,並將安裝Oracle 軟件的用戶添加到這個本地組中。

如果作爲dba組成員之外的用戶登錄並需要使用RMAN,就必須創建和使用一個口令文件來連接來連接到目標數據庫。如果要使用一個客戶系統通過網絡來連接RMAN,也需要創建和使用一個口令文件。

三. RMAN 備份的網絡拓撲結構

RMAN 是一個客戶端應用程序,它通過Oracle net 連接來與目標數據庫連接。 如果目標數據庫位於ORACLE_HOME 主目錄中,運行同樣位於這個主目錄中的RMAN 可執行文件,ORACLE net連接就會是一個本地連接。  只要在Oracle 環境中設置了合適的ORACLE_SID 變量,就不需要爲這個連接提供一個Oracle net 別名。 否則,我們必須配置tnsnames.ora 文件,在文件中指定目標數據庫,並且在將要運行RMAN的位置上完成這個操作。 

一般傾向與在目標數據庫的ORACLE_HOME 中運行rman, 這是避免在混合環境中出現兼容性問題的最簡單和最直觀的方法。 我們需要在這種混合環境中負責跨越多個Oracle 數據庫和版本的備份。也可以使用OEM 來處理。

3.1 遠程運行RMAN

如果你負責管理許多數據庫。最好在單個客戶端系統上將應用程序合併,這樣就可以在這個客戶端系統上更好的管理tnsnames.ora 文件內容。如果在RMAN 配置中使用了恢復目錄(recovery catalog),由於每次操作RMAN時都會生成一個以上的Oracle net 連接,所以這樣的客戶端服務端模型不會讓人混淆。另一方面,運行與目標數據庫不同系統(或者是不同ORACLE_HOME主目錄)上的RMAN時,我們需要建立一個口令文件,這樣在每個目標數據庫上都需要更過的配置和管理。

恢復目錄: 用於存儲RMAN 備份的歷史記錄,它含有有關備份發生時間,備份內容和備份大小的元數據。 歷史記錄中還含有恢復備份所需的關鍵信息。 元數據是從默認位置(目標數據庫控制文件)析取的,並保留在用戶模式的數據庫表內。

如果要建立一個RMAN 和 目標數據庫之間的遠程連接,需要創建一個使用專用服務器進程連接到目標數據庫的tnsnames.ora 條目。 因爲RMAN 不能使用共享服務器(通常稱多線程服務器或者MTS)來建立數據庫連接。 

MYICD =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = DavidDai)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = myicd)

    )

  )

3.2 在目標數據庫的ORACLE_HOME 中運行本地RMAN

從每個目標數據庫中本地運行RMAN 實際上是管理具有數百或者上千 數據庫目標的大型企業的唯一方法。 因爲RMAN一直具有兼容性問題,將rman.exe 與目標數據庫緊密綁定可在長期運行中節省時間。雖然這種方式部署RMAN 備份存在一些缺陷,但這也是最佳方式.

 本地運行RMAN意味着只需要本地連接數據庫,而不需要建立口令文件和配置tnsnames.ora 文件。但這種簡易性也正是它的缺陷。因爲一旦引入恢復目錄或者執行數據庫複製操作,就會雨打我們之前的問題。

四. 數據庫控制文件

控制文件平常的作用是負責數據庫的物理結構,控制文件控制數據庫查找物理文件的位置,並控制每個文件當前包含(或應當包含)的頭信息,其內容包括數據文件信息,重做日誌信息和歸檔文件信息。 控制文件還含有與數據庫關聯的關鍵文件的每一個文件頭的快照(snapshot)。 

由於控制文件存儲的是數據庫文件信息,所以RMAN 會利用控制文件獲取備份所需的信息,具體的操作方式是: RMAN 使用控制文件來編譯文件列表,得到檢查點信息,並確定可恢復性。通過直接訪問控制文件,RMAN可以編譯文件列表而不需要用戶創建文件列表,這樣避免了備份腳本時的一個非常繁瑣的步驟,並且在添加一個新文件時不需要更改這個腳本。控制文件會存儲新文件的信息,因此RMAN也能從控制文件中得到這個信息。

控制文件還能用作RMAN 目錄。RMAN完成數據庫任何部分的備份後,會在控制文件中添加該備份的記錄,以及說明備份開始和結束時間的檢查點。這也是從Oracle 7 Oracle 8 版本控制文件大小呈指數增長的一個主要原因:控制文件中存在RMAN記錄。控制文件中的這些記錄通常成爲元數據,它和實際備份中記錄的數據有 ,它也可以存儲在恢復目錄中。

4.1 在控制文件中重用記錄

控制文件將內部數據記錄分爲兩類: 循環重用記錄 和 非循環重用記錄。 循環重用記錄包含可以從控制文件中刪除的信息。如: 歸檔日誌歷史信息可以被刪除,並且不會影響產品數據庫。  非循環重用記錄是哪些不能被刪除的記錄,如果控制文件因這類記錄而空間不足,則會刪除這些記錄以得到更多的空間。 非循環重用記錄包括 數據文件列表 和日誌文件列表。

控制文件中的RMAN 備份記錄屬於循環重用記錄類型,如果含有這些記錄的控制文件區域已滿,這些記錄就會刪除。這會給恢復帶來災難,致使控制文件中不存在任何備份記錄,就好像從未發生過備份一樣。一定要注意的一點: 如果控制文件不含有任何RMAN 備份記錄,RMAN 就不能使用備份來執行恢復操作。

刪除記錄指發生在控制文件空間已經滿的情況下,因此被刪除的備份肯定是非常陳舊的。 我門還可以設置更大的時間幀(time frame) 來決定控制文件刪除記錄的時間Init.ora 文件中的CONTROLFILE_RECORD_KEEP_TIME 參數控制刪除時間,默認值是7.既報錯7天。可以設置成更大的參數值,如30天。 這些就會京城擴展控制文件,且只有當記錄保留時間超過一個月時纔會重寫這些記錄。 一般將該參數設爲較大比較好。 如果參數設爲0,將不會發生重用記錄,相應地控制文件將不斷擴展至無法管理。當然不推薦這麼設置。

此外,如果要實現一個恢復目錄,就不必擔心會循環重用記錄。因爲只要在CONTROLFILE_RECORD_KEEP_TIME 

參數指定的時間內至少實現一次恢復目錄同步,那麼這些記錄將隨着時間的推移被刪除-- 恢復目錄則從不會刪除記錄。

重新構建控制文件

通常某些條件下需要重新構建數據庫控制文件,如重新設置MAXLOGFILES 參數或者MAXLOGHISTORY參數。由於某些參數定義了保存非循環重用記錄的內部控制文件表的大小,所有只有在重新構建控制文件時才能設置這些參數。如果需要更大的內部控制文件,就必須重新構建控制文件。

如果使用RMAN 而不使用恢復目錄,就必須重視控制文件的重新構建。執行:

Alter database backup controlfile to trace;

生成的腳本不包含控制文件中標識備份的信息。如果不存在備份記錄,就不能在使用這些備份恢復時訪問它們,此時所有的RMAN 信息丟失並且無法恢復。在重新構建控制文件時,只有那些RMAN設置的永久配置參數才被重新構建。 在Oracle 10g有一些新的控制用於生成控制文件中的有限備份元數據,但仍然需要許多手工操作,並且無法完全生成所有的元數據。因此建議要避免重新構建控制文件。

如果將控制文件備份爲一個二進制文件而不是一個跟蹤文件,所有備份信息都將被保留。 該命令類似於:

Alter database backup controlfile to '/u01/backup/bkup_cfile.ctl';

4.2 快照控制文件

控制文件是一個非常繁忙的文件,它存儲數據庫的結構信息,這些信息包括用於恢復的檢查點SCN信息。連續的SCN 和文件管理對於數據庫的生命期來說至關重要,因此RDBMS 必須能夠持續的使用控制文件。

這樣就會爲RMAN帶來一個問題。RMAN 開始備份每一個數據文件時需要得到一個一致的控制文件視圖,此時RMAN 只需要知道備份開始時最新的檢查點信息和文件就夠信息。開始備份後,RMAN 需要這些信息在備份操作期間保持一致,也就是說RMAN需要一個讀取一致的控制文件視圖。除非RMAN 在備份持續時間內鎖定控制文件,否則數據庫會不斷更新控制文件,所以不可能。 但是,鎖定控制文件意味着數據庫不能執行檢查點操作和切換日誌,或則不能產生新的歸檔日誌,這些操作是不可能的。

RMAN 使用快照控制文件(snapshot controlfile)來解決前面提出的問題,快照控制文件是控制文件的副本。 RMAN 只在備份和同步操作期間使用快照控制文件。 這些操作開始時,RMAN 會根據實際控制文件來刷新快照控制文件,這樣會短暫的鎖住控制文件,隨後,RMAN 會切換到快照並在備份持續使用這個快照。 這種方式具有讀取一致性,且不妨礙數據庫活動。

在默認情況下,快照控制文件位於UNIX 平臺上的ORACLE_HOME/dbs 目錄中,或者是在windows ORACLE_HOME/database 目錄下。 快照控制文件的默認名爲SNCF<SID>.ORA。 使用configure snapshot controlfile命令可以在任何時候更改快照控制文件名:

Configure snapshot controlfile name to 'location/file_name';

五. RMAN 服務器進程

RMAN 生成一個到目標數據庫的客戶連接,並創建兩個服務器進程。其中主要進程生成對SYS模式中的數據包的調用,從而執行備份和恢復操作,該進程會在備份和還原期間協調通道進程的工作。

另外一個次要的進程(或影子進程)輪詢RMAN中的所有長事務(long-running transaction)並在內部記錄信息。 在V$version_longops 視圖中可以查看到下面的輪詢結果:

/* Formatted on 2010/6/8 16:49:36 (QP5 v5.115.810.9015) */

SELECT   sid,

         serial#,

         context,

         sofar,

         totalwork,

         ROUND (sofar / totalwork * 100, 2) "%_complete"

  FROM   V$SESSION_LONGOPS

 WHERE       opname LIKE 'PMAN'

         AND opname NOT LIKE '%aggregate%'

         AND totalwork != 0

         AND sofar <> TOTALWORK

還可以在v$version 視圖中查看這些進程。 RMAN 分配一個通道時,它會在輸出中提供如果所示的會話ID信息:

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: SID=19 設備類型=DISK

SID 信息對應與v$session 中的SID 列。

SQL> col client_info format a30

SQL> col program format a15

SQL> select sid,saddr,paddr,program,client_info from v$session where sid=19;

       SID SADDR    PADDR    PROGRAM         CLIENT_INFO

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

        19 A9CCBD10 AA728C44 rman.exe        rman channel=ORA_DISK_1

5.1 RMAN 通道進程

除了默認的兩個進程外,在備份活還原操作期間還會爲分配的每個通道單獨的創建一個進程。 RMAN 將通道是爲目標數據庫上的服務器進程,該進程在備份期間協調讀取數據文件和寫入指定位置的操作,在還原期間則協調讀取備份位置和在數據文件位置寫入數據塊的操作。 通道進程只有兩種類型磁盤通道 和 磁帶通道。 我們不能爲一個備份操作同時分配這兩種通道,備份只能寫入磁盤或寫入磁盤。 與後臺RMAN 進程一樣,可以從數據字典(data directory)跟蹤通道進程。並且將通道進程在OS 級別(OS level)上與一個SID 關聯。 正是這些通道進程的活動被輪詢的影子進程記錄到V$SESSION_LONGOPS 視圖中。

5.2 RMAN 和 I/0 從屬

如果在目標數據庫上配置了I/O從屬,RMAN 就可以使用I/0從屬。 爲了用RMAN 備份和還原,有兩種可用的I/0從屬: 磁盤I/0 從屬 和 磁帶I/0 從屬

使用DBWR_IO_SLAVES 參數可以配置磁盤I/O從屬。 這個參數可以被設置爲任意數值,它的主要作用是在將‘髒’緩衝區(即寫滿的緩衝區)的內容寫入磁盤時喚醒另外的DBWR從屬來執行磁盤寫操作。 如果參數被設置爲非0值(如:11223),RMAN 會自動在每個通道中切換使用4I/O 從屬來幫助將數據庫讀入RMAN內存緩衝區。 這是一個不錯的功能,但是RMAN 分配內存的方式有很大的變化。 只有在OS 平臺不支持本地異步或者禁止Oracle RDBMS使用異步I/O時,DBWR_IS_SLAVES參數纔會起到作用,如果支持異步I/O,就不需要使用磁盤I/O從屬。

磁帶I/O 從屬可幫助服務器進程訪問磁帶設備。 如果BACKUP_TAPE_IO_SLAVES 參數被設置爲TRUERMAN 會爲每個磁帶通道進程分配一個I/O 從屬來幫助在磁帶位置上執行寫操作。 與磁盤I/O 從屬不同的是,BACKUP_TAPE_IO_SLAVES 參數只對RMAN 磁帶備份起作用。 由於磁帶設備不存在本地異步I/O,我們建議將該參數設置爲true。 這有助於保持磁帶設備傳輸,以達到更佳的備份和還原性能。

六. RMAN 使用的SYS數據包

RMAN 服務器進程在協調通道工作時要訪問兩個SYS數據包:DBMS_RCVMAN 數據包 和 DBMS_BACKUP_RESTORE 數據包, 這兩個包包含了目標數據庫中RMAN的所有功能。

6.1  SYS.DBMS_RCVMAN 數據包

DBMS_RCVMAN 數據包用來訪問控制文件中的表並將此信息傳遞給RMAN,使用RMAN 可以構建準確反應數據庫結構的備份和還原操作。DBMS_RCVMAN 包負責在執行任何操作前設置time 運算符和校驗數據文件頭中的檢查點信息,並價差文件位置和大小,以及有關節點相似性(在RAC 環境中)和磁盤相似性的其他信息。 這種信息會影響RMAN的性能,並且RMAN 在構建實際備份/還原命令之前自動執行負載均衡(load-balancing)算法和性能增強(performance-enhancing)算法。 

6.2 SYS.DBMS_BACKUP_RESTORE 數據包

SYS.DBMS_RCVMAN 包訪問控制文件並校驗所有必須的信息。 這些必須的信息被傳遞迴RMAN服務器進程,RMAN 服務器進程隨後會基於recover.bsq 文件中的代碼創建一些PL/SQL 塊。 這些PL/SQL 塊含有對DBMS_BACKUP_RESOTRE 數據包的調用,實際上RMAN 中是由DBMS_BACKUP_RESTORE數據包來創建系統調用以備份數據文件,控制文件和歸檔的redo log RMAN 接收從DBMS_RCVMAN 數據包返回的信息,並在通道間基於負載均衡算法分配工作,然後創建一系列DBMS_BACKUP_RESTORE 數據包調用。 

V$SESSION_LONGOPS 視圖中可以跟蹤的是DBMS_BACKUP_RESTORE 數據包的工作。它執行備份和還原操作,此外還可以以受限方式訪問控制文件。 DBMS_BACKUP_RESTORE 數據包訪問控制文件以備份該文件(實際上是控制文件的快照),在備份完成後寫入備份信息。 一旦完成了一個備份集, DBMS_BACKUP_RESTORE 數據包就會在控制文件的表中寫入備份開始時間,備份大小和備份名的信息。

6.3 內核中的RMAN 數據包

創建數據庫時,運行cataproc.sql 腳本可以默認安裝上述兩個RMAN 數據包。 數據庫創建期間無法跳過這一步驟。所以在8i 以後的每個版本里都存在rman 包。

這些RMAN 數據包還有一個重要的特性,他們被硬編碼到Oracle 軟件的庫文件中,因此及時沒有打開數據庫也可以調用這些數據包。 我們知道,大多數數據包只在數據庫打開時才能被使用,不過RMAN可以在數據庫實例處於未加載模式或者加載模式時編寫對DBMS_BACKUP_RESTORE 數據包的調用。 這也是爲什麼在沒有打開數據庫時也能夠備份和還原數據庫。

七. 備份數據塊

即使是高級備份技術,備份的單元依然是數據文件,最終進行備份的OS 使用程序將查看並備份整個文件,因此需要特別注意保證Oracle 數據塊的完整性,然後,RMAN 與之不同,因爲RMAN 是集成在RDBMS 中的,它是在數據塊層面訪問數據,這和數據庫本身所使用的方式相同。

塊級別訪問是RMAN 區別於其他備份工具的地方,正是由於rman 採用了這一層面的訪問,才使得它具有諸多優勢,因此我們可以更有效的利用數據塊進行備份和恢復。

7.1 數據塊備份概述

數據塊備份的工作原理:RMAN 基於備份算法規則來編譯要備份的文件列表。基於通道數和同時備份的文件數,RMAN Oracle 共享內存段中創建一些內存緩衝區。 一般在PGA中,不過有時內存緩衝區會被推入SGA。 通道服務器進程隨後開始讀取數據文件,並在RMAN緩衝區中填充這些數據塊。一個緩衝區被填充時,輸入緩衝區中的數據快會被推入輸出緩衝區。 數據文件中的每個數據塊都會發生這種內存對內存的寫操作(memor-to-memory write)。 如果數據塊複合備份的標準並且內存對內存的寫操作沒有檢測到訛誤(corruption),則這些數據塊會保留在輸出緩衝區中直至輸出緩衝區被填滿。 一旦輸出緩衝區被填滿,輸出緩衝區就會被推至備份位置(磁帶或者磁盤)。

一旦所有文件已通過內存緩衝區過濾,就完成了備份片,同時RMAN 會在目標數據庫的控制文件中寫入備份片的完成時間和備份片的名稱。

7.2 塊級備份的優點

每個數據塊從磁盤移入內存時都會發生內存對內存的寫操作,在這個操作期間會檢查數據塊的訛誤。訛誤檢查是RMAN的一個重要特性。 要注意的是執行代理複製操作時是不會使用數據庫檢查的。

訪問數據塊時可以選擇 空值壓縮(null compression),我們可以刪除從來沒有使用過的數據塊(頭爲0),並在執行內存對內存的寫操作時丟棄這些數據塊,因此,我們只需要備份使用過的數據塊,從而執行更有效的備份操作。

塊級備份從生成redo 的角度來說也提供了性能增益。如果是老式的熱備份方法,運行熱備份模式的表空間生成的redo log數量有失會呈指數增長,這會造成過多的redo 切換,檢查點故障和 生成大量的redo log。巨量的archive log會給日誌歸檔位置上的空間管理帶來一定困難。

另一方面,由於在備份期間不要求保證數據塊的一致性,所以RMAN不要求用熱備份模式。RMAN 對數據塊的訪問允許RMAN 與寫‘髒’緩衝區的DBWR進程協調,並且在將這個數據塊讀入內存以前,它可以等待直至數據塊達到一致,因此數據塊不會被轉存爲redo,並且備份中的數據塊總是一致的。

當然,RMAN 也不要求用archive log 模式,但是如果是非歸檔模式,rman 不允許我們在數據庫打開時備份一個數據文件,否則會報如下錯誤:ora-19602cannot backup or copy active file in NOARCHIVELOG mode

RMAN 可以使用塊級備份提供進一步的恢復新選項: 塊介質恢復(block media recovery. 如果出現: ora-1578:block corruption detected, 就不需要恢復整個文件以及執行恢復操作,RMAN 可以簡單的恢復壞數據塊並執行恢復操作,也就是說數據文件中的其他數據在恢復期間仍然可用。

八. 內存中的RMAN

RMAN 會在內存中構建一些緩衝區,然後通過這些緩衝區將數據塊寫入到備份中。 內存的利用與PGA(有時是SGA)的總體大小有關。 內存緩衝區分爲輸入緩衝區和輸出緩衝區。 輸入緩衝區(input buffer)填充從備份文件中讀取的數據塊;輸出緩衝區(output buffer)則在執行內存對內存的寫操作時填充需要備份的數據塊,一旦輸出緩衝區被填滿,輸出緩衝區的內容就會被寫到備份位置。

8.1 輸入內存緩衝區

備份數據庫時,輸入內存緩衝區的大小和數據取決於實際執行的備份命令,事實上它主要取決於在一個備份中多路服用(multiplexing)的文件數。 多路複用指的是在同一個備份片中備份某數據塊的文件數。爲了保持合理範圍的內存分配,根據一起備份的文件數,分配內存緩衝大小需要應用下面的規則。

1) 如果備份集內的文件數小於或者等於4個,RMAN 會爲每個文件分配4個大小爲1MB的緩衝區。緩衝區總和小於或者等於16MB

2) 如果備份集內文件數多餘4個但少於等於8個,RMAN 會爲每個文件分配4個大小爲512KB的緩衝區。緩衝區總和確保少於或者等於16MB

3) 如果多路複用的文件數多餘8個,RMAN 會爲每個文件分配4個大小爲128KB的緩衝區。這就確保每個要備份的文件佔用512KB的緩衝區內存。

一定要記住在每個通道基礎上分配內存大小。因此,如果分配兩個通道來備份具有32個數據文件的數據庫,RMAN會根據負載均衡來分配兩個通道,而不是爲每個通道分配16個文件。 如果某些文件比另外的文件大的多,我們可能在一個備份集內備份8個文件,在另一個備份集內備份24個文件。 如果是這樣,則用於第一個通道(8個文件)的緩衝區會分配16MB的輸入緩衝區(8個文件,每個文件有4個緩衝區,每個緩衝區512Kb),用於第二個通道(24個數據文件)的緩衝區會分配12MB的輸入緩衝區(24個文件,每個文件的緩衝區爲512KB)。

可以使用如下的查詢來監控備份運行時基於每個每個文件的緩衝區大小:

/* Formatted on 2010/6/9 9:37:52 (QP5 v5.115.810.9015) */

  SELECT   set_count,

           device_type,

           TYPE,

           filename,

           buffer_size,

           buffer_count,

           open_time,

           close_time

    FROM   v$backup_async_io

ORDER BY   set_count,

           TYPE,

           open_time,

           close_time;

8.1.1 備份到磁盤時的輸出內存緩衝區

除了輸入緩衝區之外,RMAN還會根據輸出設備分配輸出緩衝區。如果備份到磁盤,則RMAN 將分配輸出緩衝區以在數據溢出到備份片之前接收來自輸入緩衝區的數據塊。此時,每個通道有4個輸出緩衝區,每個輸出緩衝區大小爲1MB,因此每個通道的內存區域通常爲4MB

8.1.2 備份到磁帶時的輸出內存緩衝區

備份到磁帶時的內存分配是不同的,這是由於磁帶設備的I/0速率較慢。在磁帶上備份或從磁帶上恢復時,RMAN會爲每個通道進程分配4個輸出緩衝區,每個緩衝區的大小爲256KB,因此每個通道的內存區域通常爲1MB

8.2 用於還原的內存緩衝區

還原操作期間的內存分配與備份操作期間的內存分配稍有不同,這是因爲他們的作用是相反的:備份操作是讀取數據文件並寫入備份位置,而還原操作則是讀取備份位置並寫入數據文件。 還原磁盤備份時,輸入緩衝區的大小爲1MB,同時RMAN 會爲每個通道分配4個緩衝區。 還原磁帶備份時,RMAN 會分配4個輸入緩衝區,每個緩衝區的大小等於blksize參數的值(默認值爲256kb)。用於還原的輸出緩衝區通常爲128kb,並且每個通道有4個輸出緩衝區。

8.3 RMAN內存利用: PGA 和 SGA

在磁盤上的備份會使用PGA內存空間作爲備份緩衝區,PGA 內存空間從用於通道進程的內存空間中分配。如果操作系統沒有配置本地異步I/O,可以利用DBWR_IO_SLAVES參數使用I/O從屬來填充內存中的輸入緩衝區。如果設置DBWR_IO_SLAVES 參數爲任意的非零值,RMAN 會自動分配4I/O 從屬協調輸入緩衝區內存中的數據塊加載。爲了實現這一功能,RMAN 必須利用一個共享內存區域。因此,用於磁盤備份的內存區會被推入共享池,如果存在large池,則被推入large池。

如果沒有使用磁帶I/O從屬,會在PGA中分配用於磁帶輸出緩衝區的內存。設置init.ora 參數BACKUP_TAPE_IO_SLAVES=TRUE,可以使用磁帶I/O從屬,必要時還可以在spfile裏動態修改。 該參數設爲true時,rman 會爲每個通道創建一個從屬進程來幫助備份工作。爲了協調這一功能,RMAN 會將內存分配推進SGA

如果配置了任一種I/O從屬選項並且沒有配置large 池,則會在SGA的共享池曲終分配內存。如果沒有配置large池又要使用I/O從屬,建議最好創建一個large池,這個large池的大小基於爲備份分配的通道總數(加上1MB用於開銷)。

九. 恢復目錄

恢復目錄存儲的是與RMAN 備份有關的元數據。在某種意義上,恢復目錄可以看做是保存RMAN 備份和恢復所需的相關信息的副本。我們可以在Oracle 數據庫中在用戶模式下創建恢復目錄,這個恢復目錄僅僅是一些數據包,表,索引和視圖。 RMAN 中的再同步命令會使得目標數據庫控制文件中的內容刷新這些表中的數據。當然,區別在於恢復目錄可以包含企業中所有數據庫的信息,而控制文件只包含關於它自己的數據庫的信息。

在連接恢復目錄的連接字符串中,要輸入該RMAN目錄用戶的用戶名和口令。與連接目標數據庫不同,到恢復目錄的連接不是一個sysdba連接,因此不需要sysdba 權限。

一旦連接了恢復目錄,就可以手工在同步恢復目錄,或者任何備份操作都可以隱式的再同步恢復目錄。 再同步是指用目標數據庫控制文件中的內容刷新恢復目錄中表的信息。

一個恢復目錄可以存儲多個目標數據庫的信息,這樣可以集中管理許多不同數據庫的備份,通過SQL可以查詢恢復目錄的視圖,由此確定在恢復目錄中註冊的每個目標數據庫的備份數,備份大小和備份範圍。

 恢復目錄中存在數據包DBMS_RCVMAN給包含該恢復目錄的數據庫帶來混亂,這樣的數據庫通常稱爲目錄數據庫(catalog database)。目錄數據庫也可能是目標數據庫,它也含有SYS模式中的DBMS_RCVMAN 數據包,因此如果選擇目錄數據庫中的DBA_OBJECTS,就會存在模式不同但是名稱相同的兩個數據包。 這樣並不會引起錯誤或我難題。因爲其中一個數據包在數據庫創建時由cataproc.sql 構建(在SYS模式下),另外一個數據包則是在創建恢復目錄時構建,在常規用戶模式下。

恢復目錄中的第二個數據包是DBMS_RCVCAT數據包,這個數據包只在RMAN操作期間執行特殊的恢復目錄操作。實質上,可以將這個數據包看做恢復目錄的DBMS_BACKUP_RESTORE數據包實現。區別僅在於DBMS_BACKUP_RESTORE數據包在目標數據庫控制文件中寫入備份完成信息,而DBMS_RCVCAT數據包則將這些信息寫入恢復目錄。

另外,包含恢復目錄中信息的基表(base table)並不重要,因爲我們不想手工修改這些基表。爲了保護恢復目錄,Oracle創建了一系列前綴爲RC_的視圖,使用這些視圖可以從恢復目錄中析取信息。手工執行任何針對目錄對象的DML命令都是非常危險的。還有一點,這些視圖是數據庫控制文件中相應v$視圖的不同實現。

十. 輔助數據庫

輔助數據庫(auxiliary database)是指在表空間時間點恢復(Tablespace Point In Time Recovery: TSPITR,,複製操作(克隆數據庫)或使用RMAN 備份創建備用數據庫時,爲了還原目標數據庫的文件而臨時生成的實例。執行上述任一種任務時,我們都要在RMAN中同時連接目標數據庫和輔助數據庫,這樣就可以利用目標數據庫控制文件中的備份信息在輔助數據庫位置調整這些備份還原。

RMAN>connect target /

RMAN>connect auxiliary sys/pwd@SID

執行這些命令後,RMAN會同時生成到每個數據庫的連接,並要求訪問目標數據庫與輔助數據庫中的SYS.DBMS_BACKUP_RESTORE 和 SYS.DBMS_RCVMAN 數據包。 這樣一來,RMAN要求用戶對輔助數據庫具有與目標數據庫相同的sysdba權限。由於RMAN必須生成到這兩個數據庫的sysdba 連接,而且不可能本地連接兩個不同的數據庫,所以必須至少要配置一個數據庫,創建一個口令文件,並且生成到這個數據庫的Oracle net 連接。

十一. 版本兼容性

鑑於必須使用多種不同的組件,所以在使用RMAN時必須注意數據庫版本的限制。兼容性問題分爲5個部分,每一個部分都有一個版本號:

1) RMAN 可執行文件版本(客戶端使用程序)

2) 目標數據庫

3) 恢復目錄模式

4) 恢復目錄數據庫

5) 輔助數據庫(用戶複製,TSPITR和備用數據庫的創建)

當然,解決兼容性問題的最佳方法是保證這些組件都使用最新的版本,如果使用相同版本的組件,一切都會井然有序。

11.1 目標數據庫與RMAN 可執行文件

 一個通用規則:儘量保證目標數據庫與RMAN可執行文件使用的是相同的版本。如果在目標數據庫環境下運行RMAN,做到這一點就很容易。如果從一個集中的客戶端接口運行所有RMAN工作,這將非常棘手,它意味着客戶端需要安裝一個ORACLE_HOME客戶端,版本上要對應需要連接和備份的每個數據庫版本,該解決方案相當複雜。 使用10G OEM 可以解決這個問題,該軟件支持集中的客戶端接口,因爲我們可以從單個控制檯使用遠程RMAN可執行文件,或者在多個DBA完成備份任務時從控制檯使用遠程RMAN可執行文件。

11.2 恢復目錄數據庫與版本目錄模式

針對恢復目錄數據庫與恢復目錄模式的兼容性問題,一種簡單的方法,就是在高版本的數據庫(如11g)中創建該版本的恢復目錄,那麼這個目錄可以註冊低版本的數據庫。但是低版本不能註冊高版本的。

11.3 輔助數據庫

從兼容性觀點看,輔助數據庫必須與要複製的目標數據庫採用相同的版本。實際上,最好在複製的數據庫中插入與目標數據庫相同版本的ORACLE_HOME 主目錄。

12. RMAN 進程

先舉一個簡單的備份例子:

C:>Rman target /

Rman>backup database;

詳細的看一下RMAN 備份的全過程:

RMAN 生成到目標數據庫的bequeath連接,這就是說RMAN會檢查ORACLE_SID變量中的實例名,並在該實例上產生一個服務器進程,然後作爲sysdba用戶登錄。這樣我們被連接爲內部數據庫用戶sysrman會立即產生一個用於執行備份操作的通道進程。 如果使用默認設置,就只分配一個通道。 在沒有使用I/O從屬的情況下,通道進程會在PGA中分配內存。

隨後RMAN 通過編譯一個sys.DBMS_RCVMAN調用,從目標數據庫控制文件中請求數據庫結構信息,顯示確定目標數據庫的版本。RMAN從控制文件中收集版本信息和控制文件本身的信息,控制文件本身的信息包括控制文件的類型,控制文件中的當前序列號以及控制文件的創建時間。

我們在例子中指定了數據庫的完全備份,所以RMAN會請求數據庫中每個數據文件的信息,並且判斷是否存在離線的數據文件。這些數據文件信息包括每個數據文件所在磁盤和工作方式的信息,由於使用了默認設置,所以只存在一個通道和一個備份集。 這樣以來,rman會忽略所有的相似性信息,把注意力放在編譯包含在數據集內的文件列表上。

編譯了文件列表之後,RMAN 就準備開始執行備份進程。 爲了保證一致性,RMAN必須構建快照控制文件。如果存在快照控制文件,RMAN會將這個文件重寫爲新的快照控制文件。 接下來,RMAN創建對DBMS_BACKUP_RESTORE數據包的調用,該調用可以創建備份片,備份片被構建在默認的文件位置中,UNIX系統中的這個文件位置是ORACLE_HOME/DBSWINDOWS 下默認位置是: ORACLE_HOME/database。 RMAN 擁有文件列表,所以它可以爲磁盤讀取操作分配內存緩衝區。假如實例有20個數據文件,這樣RMAN 會分配一些大小爲128KB的輸入緩衝區,由於每個文件有4個輸入緩衝區,所以這些輸入緩衝區總共就需要10MB內存。RMAN 只分配4個輸出緩衝區,每個輸出緩衝區爲1MB。 所以備份操作總共需要的內存是14MB

分配了內存之後,RMAN 初始化備份片。備份片會得到一個唯一的默認名。隨後RMAN 開始備份。9i以後,RMAN 50M 爲增量分配磁盤空間,在磁盤上分配50MB的空間並填充輸出緩衝區,當輸出緩衝區滿時,則獲取另一個50MB空間,知道將最後一個數據塊轉存到被分片上。當備份完成時,釋放最後一個50MB數據塊上的剩餘空間。 要注意的是:RMAN 不再檢查是否存在用於成功備份操作的足夠空間,這是因爲空值壓縮和新的10g 空白壓縮可以極大地減少備份中的數據文件大小。相反,RMAN 將運行它的備份知道空間用完,然後備份失敗。

一旦初始化了備份片,通道進程就可以開始數據庫備份進程。RMAN會判斷是否使用了spfile,如果使用了spfileRMAN 會自動將該文件備份爲備份集的一部分。RMAN 還要在備份集中備份當前控制文件。只要備份了SYSTEM 表空間,就會自動備份當前的控制文件。

完成spfile和控制文件的備份後,就開始讀取數據文件並將數據塊推入內存,爲了實現這一功能,通道進程在磁盤上執行預讀(read-ahead)操作,並且將多個數據塊同事推入內存。隨後發生的是從輸入緩衝區到輸出緩衝區的內存對內存的寫操作,在這個寫操作期間,RMAN會判斷數據塊是否被初始化,或者數據塊頭信息是否仍然爲零。如果數據塊未被使用過,就不會發生到輸出緩衝區的寫操作,同時丟棄這個數據塊。如果數據塊被使用過,RMAN就會在這個數據塊上執行檢驗和checksum 操作。 如果數據塊的頭和腳註不匹配,這個數據就會被寫入輸出緩衝區。

一旦輸出緩衝區被填滿,就會將輸出緩衝區的內容轉存儲到備份文件位置。 由於RMAN緩衝區填充來之所有數據文件的數據塊,所以在轉存儲文件中的數據塊是雜亂無序的。 轉儲文件只是一個存儲段,只有RMAN能夠在還原時將這些數據塊還原到正確的位置。在備份片中寫入數據塊時,可以從RMAN影子進程中得到備份的狀態信息。RMAN影子進程在目標數據庫上檢查遠程過程調用(RPC),並將信息傳遞給V$VERSION_LONGOPS視圖,以供用戶查看。基於在備份操作開始時收集的信息,RMAN會估計每個通道進程完成的百分比,可以通過一下SQL 查看:

/* Formatted on 2010/6/9 22:50:05 (QP5 v5.115.810.9015) */

SELECT   sid,

         serial#,

         context,

         sofar,

         totalwork,

         ROUND (sofar / totalwork * 100, 2) "%_complete"

  FROM   v$session_longops

 WHERE       opname LIKE 'RMAN%'

         AND OPNAME NOT LIKE '%aggregate%'

         AND sofar <> totalwork;

在備份進程期間,可以重複執行這個腳本,來查看剩餘工作量信息。

一旦一個數據文件的所有數據塊都被讀入輸入緩衝區並且確定狀態,RMAN 就會通過將這個數據文件頭寫入被分片來結束該文件的備份操作。在所有數據文件頭都被寫入備份片之後,RMAN 會生成最後一個對SYS.DBMS_BACKUP_RESTORE數據包的調用,該調用在控制文件中寫入備份信息,這些備份信息包括備份片名,啓動備份操作時的檢查點的SCN和完成備份操作的時間。

以上就是備份操作的所有過程。如果想進一步瞭解備份內存的工作流程,可以啓動調試選項,從而得到一個完成的進程列表。 不過這個操作可能會影響備份的性能。 最好只在測試環境下使用。

Rman target / debug trace=/u01/backup/rmanback.out

13. 閃回恢復區

閃回恢復區(Flash recovery area: FRA)不是所有RMAN 需要的組件,但是它應該成爲RMAN所需的組件。作爲10g 版本的新特性,FRA是磁盤上用於存儲所有Oracle 恢復文件的特定位置。 恢復文件是指進行介質恢復時所需的所有文件完全的數據文件備份,增量備份,數據文件副本,備份控制文件以及歸檔的日誌。 FRA 也存儲聯機重做日誌,塊更改跟蹤文件以及當前控制文件的鏡像副本。 具體內容參考:

Oracle Flashback 技術 總結

http://blog.csdn.net/tianlesoftware/archive/2009/10/16/4677378.aspx

 

 

注: 整理自《ORACLE 10g RMAN 備份與恢復》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章