教你如何成為Oracle 10g OCP - 第十三章補充:RMAN的組成及工作原理

tolywang發表於2011-07-11


 
-----   RMAN的組成及工作原理 
 
RMAN由可執行程式和名為recover.bsq的指令碼檔案組成,RMAN可執行程式就是命令列介面
(命令解釋程式),在備份和恢復過程中,可執行程式完成的實質性工作很少,進行的大部
分都是協調工作。
 
 
備份恢復工作的實質性工作是由目標資料庫上的程式包完成的,對目標資料庫上包的呼叫
就要藉助於recover.bsq 指令碼檔案了,該檔案在$ORACLE_HOME/rdbms/admin目錄下,開啟
檔案可以看到裡面都是各種PL/SQL指令碼塊。事實上,在RMAN互動介面中輸入的各種命令,
都會被RMAN可執行程式轉化為對recover.bsq檔案中的各種相關的PL/SQL塊的呼叫,並將
相關的PL/SQL塊傳遞到目標資料庫上去執行,從而完成對資料庫的備份與恢復,可以說,
recover.bsq (實質上是一個庫檔案)才是RMAN備份恢復的核心 。要注意的是,可執行檔案
和recover.bsq檔案需要版本一致,否則不能正常工作。

在recover.bsq檔案包含的PL/SQL塊中,主要呼叫了目標資料庫中以下兩個程式包。
 
dbms_rcvman : 用來讀取目標庫的控制檔案資訊,將這些資訊傳給RMAN, 從而RMAN可以
獲得要備份的檔案列表以及其他所需的資訊。
dbms_backup_restore :  完成具體的備份恢復工作,並在控制檔案中寫入備份的元
資料,比如建立備份的時間,路徑,大小等。
 
而且由於RMAN可以在資料庫關閉的情況下進行備份,因此這兩個包都是硬編碼在Oracle
軟體中的,在資料庫沒有啟動的時候也能呼叫執行。
 
 

--- 核心中的RMAN資料包

建立資料庫時,執行cataproc.sql可以預設安裝dbms_rcvman及dbms_backup_restore兩個
包,dbca建立期間無法跳過這一步,所以8i以後的版本中都存在rman包。 而且他們被硬編
碼到Oracle軟體的庫檔案中,因此即使沒有開啟庫,也可以呼叫這些資料包。我們知道,
大多數資料包只有資料庫開啟時才能被使用,不過RMAN可以在資料庫例項處於nomount和
mounted模式時編寫對dbms_backup_restore資料包的呼叫(nomunt狀態只能用於恢復)。

RMAN是做物理備份的,RMAN工作的時候呼叫dbms_backup_restore 包,這個包整合到ORACLE
核心中,即使在nomount狀態下也可以做恢復(但注意,nomount狀態不能做備份)。

用RMAN做備份的前提是目標資料庫必須是OPEN或MOUNT狀態,因為要把備份的後設資料寫入
控制檔案。
 

---------------------------------------------------------
在目標庫所在server上做rman備份。
1. 沒有恢復目錄, 且目標庫open, : 使用目標庫中的recover.bsq及目標庫中的程式包。  
2. 沒有恢復目錄, 且目標庫mounted, 使用目標庫中的recover.bsq及目標庫中的Oracle硬編碼程式包。 
3. 有恢復目錄, 且目標庫open :    使用目標庫中的recover.bsq及目標庫中的程式包。
4. 有恢復目錄, 且目標庫mounted : 使用目標庫中的recover.bsq及目標庫中的Oracle硬編碼程式包。
 
在恢復目錄庫所在server上做rman備份。
1.  目標庫open :    使用恢復目錄庫中的recover.bsq及目標庫中的程式包。
2.  目標庫mounted : 使用恢復目錄庫中的recover.bsq及目標庫中Oracle硬編碼的程式包。
---------------------------------------------------------
 

--- RMAN與資料庫許可權

RMAN需要訪問目標庫sys使用者下的各種資料包,還需要啟動和關閉目標庫的許可權,所以
RMAN通常以sysdba身份連線到目標庫。
 
 

--- RMAN備份的網路拓撲結構
 
RMAN透過Oracle Net連線到目標庫,一般傾向於在目標庫的ORACLE_HOME中執行RMAN, 這
是避免在混合環境中出現相容性問題的最簡單的方法。 我們需要在這種混合環境中負責
跨多個oracle資料庫和版本的備份。注意:RMAN不能使用共享伺服器。

 

--- 資料庫控制檔案

控制檔案用作RMAN備份目錄,RMAN完成DB任何備份後,會在控制檔案中新增該備份的
後設資料(備份開始及結束時間檢查點,備份檔案大小,檔名等),這些也可以儲存在
恢復目錄中。 控制檔案記錄分為迴圈重用部分及非重用部分,RMAN備份記錄及歸檔
日誌歷史資訊屬於迴圈重用記錄, RMAN備份記錄如果被重用覆蓋,RMAN就不能使用
備份來執行恢復操作。 控制檔案中可刪除部分預設儲存7天。需要注意的是,即使有
了恢復目錄,備份資訊還是會寫入控制檔案 。
 
如果要實現一個恢復目錄,就不用擔心重用問題,因為只要在controlfile_record_keep_time
引數指定的時間內至少實現一次恢復目錄同步(控制檔案中的備份資訊同步到恢復目錄),
那麼這些記錄將隨著時間的推移被刪除。
 

--- 快照控制檔案


控制檔案非常繁忙,但是RMAN開始備份每一個資料檔案的時候是需要得到一個一致的控制檔案
的(備份期間鎖定控制檔案時不可能了),其實RMAN只需要知道備份開始時最新的檢查點資訊和
檔案就夠了,開始備份後,RMAN需要這些資訊在備份期間保持一致。
 
RMAN使用快照控制檔案(snapshot controlfile)來解決當前的問題,快照控制檔案是控制檔案
的副本。RMAN只是在備份和同步操作期間使用快照控制檔案。這些操作開始時,RMAN會根據實
際控制檔案來重新整理快照控制檔案, 這樣會短暫鎖定控制檔案,隨後,RMAN 會切換到快照並在備
份期間持續使用這個快照, 這種方式具有讀取一致性,且不妨礙資料庫活動。

預設情況下,快照控制檔案位於unix平臺的ORACLE_HOME/dbs目錄下,或windows的
ORACLE_HOME\database目錄下,使用下面命令可以更改快照控制檔名:
configure snapshot controlfile name to 'location\file_name'
 

如果rman需要從讀一致性的控制檔案中再同步的話,RMAN會建立臨時snapshot 控制檔案。
RMAN只在恢復目錄再同步或者備份當前控制檔案的時候需要快照控制檔案。
 

如果不透過rman,oracle是無法實現聯機全備的,這也是oracle比較尷尬的事情,
oracle透過rman實現了聯機全備,最本質的原因就是引入了snapshot controlfile,
因為scn時時刻刻是要被寫入控制檔案的,但是聯機全備時又需要短暫的鎖住控制
檔案(全備時要保證控制檔案,資料檔案scn是一致的啊),這樣就產生了矛盾,於
是在rman中就引入了snapshot controlfile,事實上在rman備份時用snapshot
controlfile臨時代替了controlfile,備份之後他們之間又重新同步了

 

下面是用例子說明RMAN備份的詳細過程:

C:\>set nls_date_format=yyyymmdd hh24:mi:ss
C:\>rman  target   catalog 
RMAN> backup device type disk format 'D:\rmanbak\%U' database plus archivelog;

啟動 backup 於 2011-07-06 08:47:06
當前日誌已存檔
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在啟動存檔日誌備份集
通道 ORA_DISK_1: 正在指定備份集中的存檔日誌
輸入存檔日誌執行緒 =1 序列 =19 記錄 ID=18 時間戳=752151901
輸入存檔日誌執行緒 =1 序列 =20 記錄 ID=19 時間戳=752153326
輸入存檔日誌執行緒 =1 序列 =21 記錄 ID=20 時間戳=752155232
輸入存檔日誌執行緒 =1 序列 =22 記錄 ID=21 時間戳=752170780
通道 ORA_DISK_1: 正在啟動段 1 於 2011-07-06 08:47:12
通道 ORA_DISK_1: 已完成段 1 於 2011-07-06 08:47:37
段控制程式碼=D:\RMANBAK\1QMGOB0D_1_1 標記=TAG20110706T084708 註釋=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:28
完成 backup 於 2011-07-06 08:47:37
啟動 backup 於 2011-07-06 08:47:37
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 啟動全部資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集中的資料檔案
輸入資料檔案 fno=00001 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST01\SYSTEM01.DBF
輸入資料檔案 fno=00003 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST01\SYSAUX01.DBF
輸入資料檔案 fno=00005 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST01\USERS02.DBF
輸入資料檔案 fno=00002 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST01\UNDOTBS01.DBF
輸入資料檔案 fno=00004 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST01\USERS01.DBF
通道 ORA_DISK_1: 正在啟動段 1 於 2011-07-06 08:47:37 
通道 ORA_DISK_1: 已完成段 1 於 2011-07-06 08:48:32 
段控制程式碼=D:\RMANBAK\1RMGOB19_1_1 標記=TAG20110706T084737 註釋=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:55

通道 ORA_DISK_1: 啟動全部資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集中的資料檔案
備份集中包括當前控制檔案
在備份集中包含當前的 SPFILE
通道 ORA_DISK_1: 正在啟動段 1 於 2011-07-06 08:48:34
通道 ORA_DISK_1: 已完成段 1 於 2011-07-06 08:48:35
段控制程式碼=D:\RMANBAK\1SMGOB31_1_1 標記=TAG20110706T084737 註釋=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:02
完成 backup 於 2011-07-06 08:48:35

啟動 backup 於 2011-07-06 08:48:35
當前日誌已存檔
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在啟動存檔日誌備份集
通道 ORA_DISK_1: 正在指定備份集中的存檔日誌
輸入存檔日誌執行緒 =1 序列 =43 記錄 ID=42 時間戳=755772516
通道 ORA_DISK_1: 正在啟動段 1 於 2011-07-06 08:48:39
通道 ORA_DISK_1: 已完成段 1 於 2011-07-06 08:48:40
段控制程式碼=D:\RMANBAK\1TMGOB36_1_1 標記=TAG20110706T084838 註釋=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:02
完成 backup 於 2011-07-06 08:48:40
RMAN>

 

以上面的簡單備份為基準,描述RMAN執行過程。假設在目標庫上做RMAN備份。且使用了
恢復目錄。

RMAN的執行過程如下:

8:47:06      從current controlfile中取歸檔日誌檔案list, 開始備份歸檔日誌 
8:47:37      完成歸檔日誌備份, 之後更新備份後設資料到current controlfile   
8:47:37      從current controlfile中取資料檔案list, 開始備份資料檔案 
8:48:32      完成資料檔案備份, 之後更新備份後設資料到current controlfile    
8:48:32      開始備份控制檔案及spfile
8:48:33      生成快照控制檔案, 同時RMAN根據current controlfile重新整理快照控制檔案
8:48:34      控制檔案備份集建立
8:48:35      完成控制檔案備份  (其實備份的是快照控制檔案 ??? )
8:48:35      從current controlfile中取新歸檔日誌list, 開始備份備份期間生成的新歸檔日誌
8:48:40      完成新生成歸檔日誌的備份, 之後更新備份後設資料到current controlfile  
8:48:41      (快照檔案的最新更新時間),重新整理current controlfile 備份後設資料到快照控制檔案

備份完畢後,我們沒有看到類似 “正在啟動全部恢復目錄的 resync ,完成全部 resync”
的提示, 是因為我們在備份過程中,沒有更新控制檔案的物理內容(比如加入資料檔案),
如果有加入datafile或加入一組redo logfile, 那麼最後你就會看到“正在啟動全部恢復
目錄的 resync ,完成全部 resync” 的字樣。


注意: 因為我們最初在連線目標庫,做register database; 的時候,我們會看到如下:
“註冊在恢復目錄中的資料庫  正在啟動全部恢復目錄的 resync  完成全部 resync ”,
也就是說還沒有開始就已經將控制檔案資訊同步到了catalog, 所以後面如果對控制檔案沒有
物理上的改變,備份完畢後是不會再次進行 “全部恢復目錄的 resync” ,是否會進行“部分
恢復目錄的 resync” 還不清楚。


這裡有幾個問題點;

1. current controlfile中的備份元資訊如何同步到快照控制檔案 ?
2. 如果備份log中沒有“全部恢復目錄的 resync”,備份元資訊(特別是最後備份備份過程中
的歸檔日誌)如何更新到catalog 中 ?
3. 同步catalog使用的是快照控制檔案 ?

個人理解:
1. 備份完畢後,同步catalog之前,current controlfile中的備份元資訊會重新整理到快照控制檔案。
2. 期間如果沒有更新控制檔案,雖然不會出現“全部恢復目錄的 resync”,但備份元資訊(特別
是最後備份備份過程中的歸檔日誌)會從剛重新整理的快照控制檔案更新到catalog 中。
3. 同步catalog使用的是快照控制檔案。Oracle會比較這個檔案和catalog,完成比較後,oracle
根據這個snapshot controlfile來同步catalog,並使它們保持一致。


提示: 什麼時候需要手工同步控制檔案及catalog? 只有我們有時候用catalog,而有某些
時候又不用catalog來做backup or restore的時候才需要發出 resync catalog的命令來手工做同步。
 

 

--- RMAN備份資料塊
RMAN備份需要注意保證Oracle資料塊的完整性,它是在資料塊層面訪問資料,這和資料庫
本身所使用的方式相同。 Oracle block級別訪問是RMAN區別於其他備份工具的地方。

 


--- RMAN備份對split block的處理 

     RMAN備份是以Oracle資料塊為單位進行讀取和寫入,如果在備份某個Oracle資料塊時,
發現它是一個髒資料塊,那麼他可以等DBWn將記憶體裡的內容重新整理到資料檔案以後(RMAN會與DBWR
協調),才備份該資料塊,因此RMAN是不需要發出begin backup命令的。 同時,RMAN備份處
理split block與熱備份不一樣,它不存在redo log激增的問題,是因為它在執行備份每個數
據塊的時候會判斷這個資料塊是否是split的(RMAN比較塊頭塊尾保證塊的完整性),如果是,
它會重新讀這個資料塊(Oracle block)直到得到一個consistent version。資料塊備份被
轉儲為redo, 並且備份中的Oracle資料庫總是一致的。

在Oracle10.2.0.1及以前,RMAN只會對使用過的資料塊進行備份(不管當前是否有資料),
因為RMAN可以在資料庫未開啟的情況下備份,因此RMAN備份時,只能從物理層面來判斷某
資料塊是否被使用過,如果某資料塊頭部被格式化過,RMAN就認為它被使用過,就會備份
該資料塊。 但是Oracle10.2.0.2 或以後,Oracle只備份當前有資料的資料塊 。
 
備份期間,RMAN不要求保證Oracle資料塊的一致性,所以RMAN不要求用熱備份模式。
RMAN是在資料塊層面訪問資料,oracle block級別訪問時RMAN區別於其他備份工具的
地方。

 


--- RMAN使用的sys下的資料包
RMAN伺服器程式在協調通道工作時要訪問兩個SYS資料包:dbms_rcvman和dbms_backup_restore
資料包,這兩個包包含了目標庫中RMAN的所有功能。

dbms_rcvman包用來訪問控制檔案中的"表"並將此資訊傳遞給RMAN, DBMS_RCVMAN 包負責在
執行任何操作前設定time 運算子和校驗資料檔案頭中的檢查點資訊,檢查檔案位置和大小,
以及有關節點相似性(在RAC 環境中)和磁碟相似性的其他資訊。 這種資訊會影響RMAN的
效能,並且RMAN 在構建實際備份/還原命令之前自動執行負載均衡(load-balancing)演算法
和效能增強(performance-enhancing)演算法。

dbms_rcvman包訪問控制檔案並校驗所有必須的資訊。這些必需的資訊會被傳遞迴RMAN服務
器程式,RMAN伺服器程式隨後會基於recover.bsq檔案中的程式碼建立一些PL/SQL塊。這些
PL/SQL塊含有對dbms_backup_recover資料包的呼叫,實際上,RMAN中是由這個包來建立
系統呼叫以備份資料檔案,控制檔案及歸檔日誌。RMAN在通道間基於負載均衡演算法分配工作
,然後建立一系列dbms_backup_restore資料包呼叫。一旦完成一個備份集,dbms_backup_
restore資料包就會在控制檔案的表中寫入備份開始時間,備份大小和備份名等資訊。

 


--- 資料塊備份

RMAN基於備份演算法來編譯要備份的檔案列表。基於通道數和同時備份的檔案數,RMAN在
Oracle共享記憶體段中建立一些記憶體緩衝區,一般是在PGA中(預設),如果設定了dbwr_io_slaves
為非0值,那麼我們的緩衝區會被推入SGA中(有large pool就用large pool, 沒有就用shared
pool). 通道伺服器程式隨後開始讀取資料檔案,並在RMAN緩衝區中填充這些Oracle資料塊,
一個緩衝區被填滿時,輸入緩衝區中的資料塊會被推入輸出緩衝區。  資料檔案中的每
個資料塊都會發生這種記憶體對記憶體的寫操作(memory-to-memory write), 這種記憶體對記憶體的
寫操作還會檢測corruption,  如果沒有檢測到corruption, 資料塊會保留在輸出緩衝區直到
輸出緩衝區被填滿。 一旦輸出緩衝區被填滿,輸出緩衝區就會被推至備份位置(磁帶或磁碟)。

一旦所有檔案已透過記憶體緩衝區過濾,就完成了備份片,同時RMAN會在目標資料庫的控制檔案
中寫入備份片的完成時間和備份片的名稱。

每個資料塊從磁碟移入記憶體時都會發生記憶體對記憶體的寫操作,在這個操作期間會檢查資料塊
的corruption 。訪問資料塊時可以選擇空值壓縮(null compression), 我們可以刪除從來
沒有使用過的資料塊(頭為0),並在執行記憶體對記憶體的寫操作時丟棄這些資料塊,因此,我們
只需要備份使用過的資料塊,從而執行更有效的備份操作。

在Oracle10.2.0.1及以前,RMAN只會對使用過的資料塊進行備份(不管當前是否有資料),
因為RMAN可以在資料庫MOUNT的情況下備份,因此RMAN備份時,只能從物理層面來判斷某
資料塊是否被使用過,如果某資料塊頭部被格式化過,RMAN就認為它被使用過,就會備份
該資料塊。 但是Oracle10.2.0.2 或以後,Oracle只備份當前有資料的資料塊 。

RMAN可以在歸檔方式線上備份,但是如果是非歸檔模式,rman是不允許我們在資料庫開啟
時備份一個資料檔案,因為RMAN備份的Oracle block之間都是不一致的,需要歸檔來進行
同步。

 

 

--- 資料塊備份: 塊介質恢復(block media recovery)

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

 


--- 記憶體中的RMAN

RMAN中的記憶體緩衝區分為輸入緩衝區和輸出緩衝區。輸入緩衝區(input buffer)填充從
備份檔案中讀取的資料塊; 輸出緩衝區(output buffer)則在執行記憶體對記憶體的寫操作
時填充需要備份的資料塊, 一旦輸出緩衝區被填滿,就被寫入備份的位置。

輸入緩衝區的大小和資料取決於實際執行的備份命令,事實上它主要取決於在一個備份
中多路複用(multiplexing)的檔案數. 多路複用指在同一個備份片中備份資料塊的檔案數。


多路複用體現的是一種並行,如果系統在RMAN多路複用期間還有更多的並行的能力
且備份裝置還有空餘的能力,調整多路複用數一般都會提升備份的效能。但是這也
有一個度的問題,並不是說並行程式多高越好,如果並行度過高會對資料庫伺服器
產生影響,在降低備份伺服器效能的同時也會很多的影響到備份的效能。

從實際的測試及Oracle的建議來看,多路複用設定的規則為:如果要備份的所有磁碟
或資料檔案很好的做了條帶(stripe),多路複用處就不大了,可以將多路複用級別設
為1或者2,如果磁碟沒有做條帶,多路複用應當設一個8之下的一個值。大於8的值常
用在備份有很多空塊的檔案或在做增量備份時。

為了保持合理記憶體分配,根據一起備份的檔案數,分配記憶體緩衝大小需要遵循下面
的規則:
1. 如備份集內的檔案數小於或等於4個,RMAN會為每個檔案分配4個大小為1M的緩衝區。
緩衝區總和小於等於16M .
2. 如備份集內的檔案數小於或等於8個,RMAN會為每個檔案分配4個大小為512K的緩衝區。
緩衝區總和小於等於16M .
3. 如備份集內的檔案數大於8個,RMAN會為每個檔案分配4個大小為128K的緩衝區。這就
確保每個要備份的檔案佔用 512K 的緩衝區記憶體。 

 

-- 備份到磁碟時的輸出緩衝區

RMAN將分配輸出緩衝區以在資料溢位到備份片之前接受來自輸入緩衝區的資料塊。此時
每個通道有4個輸出緩衝區,每個大小為1MB, 因此每個通道的記憶體區域通常為4MB .

 

-- 備份到磁帶時的輸出緩衝區

備份到磁帶時的記憶體分配是不同的,這是由於磁帶裝置的I/O速率較慢。在磁帶上備份或
恢復時,RMAN會為每個通道分配4個輸出緩衝區,每個大小為 256K, 因此每個通道的記憶體
區域通常為 1M . 

 

---- RMAN的記憶體利用:PGA & SGA

在磁碟上的備份會使用PGA記憶體作為備份緩衝區,如果設定dbwr_io_slaves為任意的非零值,
RMAN會自動分配4個I/O從屬協調輸入緩衝區記憶體中的資料塊載入,為實現此功能,RMAN磁碟
備份的記憶體區會被推入SGA中的shared pool, 如果SGA中有large pool, 則被推入large pool.
預設情況下 dbwr_io_slaves=0, 所以磁碟備份預設使用PGA記憶體區。

預設backup_tape_io_slaves=false, 不使用磁帶I/O從屬,這時備份記憶體空間會使用PGA,
如果設定backup_tape_io_slaves=true, RMAN會為每個通道建立一個從屬程式來幫助備份
工作,為協調這一功能,RMAN會將記憶體分配推進到SGA.   如果配置了I/O從屬且有large
pool, 那麼會使用large池,如果沒有large池,會在SGA的shared pool中分配記憶體。large
池的大小基於為備份分配的通道總數(加上1MB用於開銷)。

 

---- 恢復目錄

恢復目錄(Recovery Catalog)儲存的是與RMAN備份有關的後設資料,可以看作是儲存RMAN備份
和恢復所需相關資訊的副本, 恢復目錄僅僅是一些資料包,表,索引和檢視。 RMAN中的再
同步命令會使得目標資料庫控制檔案中的內容重新整理到這些表中。當然,區別在於,恢復目錄
可以包含企業中所有資料庫的資訊,而控制檔案只包含它自己資料庫的資訊。

連線目標資料庫需要sysdba許可權,但是到恢復目錄的連線不需要sysdba許可權 。

一旦連線了恢復目錄,就可以手工再同步恢復目錄,或者任何備份操作都可以隱式的再同步
恢復目錄。再同步是指目標庫控制檔案中的內容重新整理恢復目錄中表的資訊。

手工執行任何針對恢復目錄物件的DML命令都是非常危險的,所以Oracle建立了字首為RC_
的檢視,可以從這些檢視中析取資訊,從而保護了恢復目錄表。 其實這些檢視是目標庫中
控制檔案中對應的v$檢視的不同實現。 

恢復目錄中還有一個資料包dbms_rcvcat資料包,可以將這個資料包看作恢復目錄的dbms_backup
_restore資料包實現。區別在於dbms_rcvcat將備份完成資訊寫入恢復目錄,而後者將資訊
寫入目標庫控制檔案。

 

 

---- 版本相容

鑑於必須使用多種不同的元件,我們在使用RMAN時必須注意資料庫版本的限制。
相容性問題分為 5 個部分,每一個部分都有一個版本號:
1. RMAN可執行版本 ;
2. 目標資料庫;
3. 恢復目錄schema ;
4. 恢復目錄資料庫 ;
5. 輔助資料庫;

為保證版本相容,儘量保證目標資料庫與RMAN可執行檔案使用的是相同的版本。
如果在目標資料庫環境下執行RMAN, 很容易做到這一點。

針對恢復目錄資料庫與恢復目錄模式的相容性問題,簡單的方式就是,在高版本
的資料庫中建立該版本的恢復目錄,這個目錄可以註冊低版本的DB, 注意低版本
不能註冊高版本的庫。

 

 

---- RMAN備份全過程

RMAN作為sysdba登入目標庫,我們被連線為內部使用者sys, rman會立即產生一個用於
執行備份的通道程式,預設只分配一個通道,預設也不會使用I/O Slave, 通道程式
會在PGA中分配記憶體。

隨後,RMAN透過編譯一個sys.DBMS_RCVMAN呼叫,從目標庫控制檔案中請求資料庫結
構資訊,RMAN從控制檔案中收集版本資訊和控制檔案本身的資訊(當前序列號,建立
時間), 比如全備份,RMAN會請求資料庫中每個資料檔案的資訊,判斷是否存在離線
的資料檔案,這些資料檔案資訊包括每個資料檔案所在磁碟和工作方式的資訊,RMAN
編譯了檔案列表之後,準備開始執行備份,為了保證一致性,RMAN必須構建快照控制
檔案,如果snapshot controlfile已經存在,那麼將這個檔案重寫為新的快照控制文
件,接下來,RMAN建立對dbms_backup_restore資料包的呼叫,該呼叫可以建立備份片,
備份片被建立在預設的檔案位置, RMAN擁有檔案類表,所以它可以為磁碟讀取操作
分配記憶體緩衝區,分配記憶體以後,RMAN初始化備份片。備份片得到一個唯一的預設值,
開始備份,RMAN不會檢查是否存在用於成功備份的足夠空間,空間如果用完,備份即
失敗。

一旦初始化了備份片,通道程式就可以開始資料庫備份程式。RMAN會判斷是否使用了
spfile, 如果使用了spfile, RMAN會自動將該檔案備份為備份集的一部分。RMAN還要
在備份集中備份當前控制檔案。 只要備份了system表空間,就會自動備份當前的控
制檔案。

完成了spfile和控制檔案的備份後,就開始讀取資料檔案並將資料塊推入記憶體,隨後
就是從輸入緩衝區到輸出緩衝區的記憶體對記憶體的寫操作,在這個寫操作期間,RMAN會
判斷資料塊是否被初始化,或者資料塊頭資訊是否仍然為零。 如果資料塊未被使用過,
就不會發生到輸出緩衝區的寫操作,同時丟棄此資料塊,這其實是一種壓縮方式,叫
Null Compression, rman永遠不會備份從來沒有使用過的資料塊。

Unused Block Compression:  從Oracle 10.2.0.2版本開始,rman 備份時候不會備份
當前沒有包含資料的資料塊(即使有被使用過),這叫Unused Block Compression。rman
現在建立一個壓縮比更強的資料檔案的備份,會不備份當前沒有用來存放資料的資料塊。
同樣這個過程也是在從輸入緩衝區到輸出緩衝區的記憶體對記憶體的寫操作期間進行。


在滿足一定條件下,Oracle 10.2.0.2.0 首先判斷oracle block是否被使用過(頭資訊
是否為零), 如果使用過,然後判斷是否存在資料, 如果存在就會在這個資料塊上執
行檢驗和checksum 操作 。 最後判斷Oracle block頭和腳註是否匹配, 判斷是否是
split block,  如果不是就寫入輸出緩衝區, 如果是split block,  那麼重新將block
備份到輸入緩衝區 。 (此過程有待確認) 


一旦輸出緩衝區被填滿,就會將內容轉存到備份檔案位置。由於RMAN緩衝區填充來自
於所有資料檔案的資料塊,所以在轉儲存檔案中的資料塊是雜亂無序的。轉儲檔案只
是一個儲存段,只有RMAN能夠在還原時將這些資料塊還原到正確的位置。在備份片中
中寫入資料塊時,可以從RMAN影子程式中得到備份的狀態資訊。RMAN影子程式在目標
資料庫上檢查遠端過程呼叫(RPC), 並將資訊傳遞給v$version_longops檢視,供使用者
檢視。

一旦一個資料檔案的所有資料塊都被讀入輸入緩衝區並且確定狀態,RMAN就會透過將
這個資料檔案頭寫入備份片來結束該檔案的備份操作。在所有資料檔案頭都被寫入備份
片之後,RMAN會生成一個對sys.dbms_backup_restore資料包的呼叫。該呼叫在控制
檔案中寫入備份資訊,包括備份片名,啟動備份操作時的檢查點SCN和完成備份操作的
時間 。

如果想進一步瞭解備份記憶體的工作流程,可以啟動除錯選項,從而得到一個完整的程式
列表。不過這個操作可能會影響到備份的效能。最好在測試環境進行。
c:\>  rman  target  /   debug  trace=/u01/backup/rmanback.out  

 


--- 閃回恢復區(flash recovery area: FRA)

作為10g 版本的新特性,FRA是磁碟上用於儲存所有Oracle恢復檔案的特定位置,恢復
檔案包括: 完全的資料檔案備份,增量備份,資料檔案副本,備份控制檔案及歸檔日誌。
FRA也儲存聯機重做日誌,塊更改跟蹤檔案以及當前控制檔案的鏡象副本 。 具體參考:
http://blog.csdn.net/tianlesoftware/archive/2009/10/16/4677378.aspx

 

--- 增量備份

注意:  9i, 10g RMAN備份機制不太一樣。9i的rman增量備份實質上是將所有的
db block做了一次遍歷,比較scn號是否發生變化,然後重新備份更新的OS塊直到
得到一個一致版本的Oracle Block;10g是做了一個scn變化表,增量備份的時候直
接從改變讀取變化的塊 。

 

參考: 


 

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

相關文章