rman體系結構

rman用戶最關心的是共享池和大池。rman使用一些oracle pl/sql程序包來執行操作,這些程序包與其他ORACLE PL/SQL程序包相同,必須加載到共享池。
rman進程
rman生產一個到目標數據庫的客戶端連接,並創建兩個服務器進程。
主要進程生產對sysmos中數據包的調用,從而執行備份和恢復操作,該進程會在備份和還原期間協調通道進程的工作。

另一個進程輪詢rman中的所有長事物,並在內部記錄信息.在V$SESSION_LONGOPS視圖中可以看到下面的輪詢結果:
select sid,serial#,context,sofar,totalwork,round(spfar/totalwork*100,2) "%_complete" from v$session_longps where opname like '%aggregate' and totalwork!=0 and sofar <> tatalwork
還可以在v$session視圖中查看這些進程。
select sid,saddr,paddr,program,client_info from v$session where sid=16;
在動態性能視圖v$process中,連接到數據庫實例的每個操作系統進程各佔一行。
v$session顯示聯接到數據庫的每會話的附加信息。
rman使用字符串rman和通道名稱填充v$seesion.client_info列。記住,每個rman通道對應於一個服務器進程,因此在v$session中,每個通道將佔一行。
select sid,spid,client_info from v$process p join v$session s on (p.addr=s.paddr) where client_info like '%rman%';


動態性能視圖v$session_longops也並非專門用於rman。oracle會在v$session_longops中記錄任何運行時間超過6秒(絕對時間)的操作,包括rman備份和恢復操作。統計信息收集以及長查詢。
rman在v$session_longops中填充兩種不同類型的行:詳細信息行,和彙總行。
詳細信息行顯示單個rman作業步驟的信息。n
彙總行適用於單個rman命令中應用的所有文件。
只有將初始化參數statistics_level設置爲typical或all時,v$session_longops視圖纔會線索有關長時間運行的rman作業的信息。statistics_level的默認值是typical。
select sid,serial#,opname,sofar,totalwork from v$session_longops where opname like 'RMAN%' and sofar<>totalwork;






在備份或還原操作期間還會爲分配的每個信道單獨創建一個進程,rman將信道視爲目標數據庫上的服務進程,該進程在備份期間協調讀取數據文件和寫入指定位置的操作,在還原期間則協調讀取備份位置和在數據文件位置寫入數據塊的材質。

rman使用的sys數據包
rman服務器進程在協調信道的工作時要訪問兩個sys數據包:DBMS_RCVMAN數據包和DBMS_BACKUP_RESTORE數據包
1.DBMS_RCVMAN數據包用來訪問控制文件中的表並將此信息傳遞給rman,使rman可以構建準確反映數據庫結構的備份與還原操作。DBMS_RCVMAN數據包負責在執行任何操作前設置TIME運算符和校驗數據文件頭中的檢查信息,並檢查文件位置和大小,以及有關節點相似性和磁盤相似性的其他信息。這種信息會影響rman的性能,並且rman在構建實際備份還原命令之前自動執行負載均衡算法和性能增強。
2.DBMS_BACKUP_RESTORE數據包訪問控制文件並校驗所有必需的信息,這些必需的信息被傳遞迴rman服務器進程,rman服務器進程隨後會基於recover.bsq文件中代碼創建一些PL/SQL塊,這些塊含有對DBMS_BACKUP_RESTORE數據包的調用。實際上rman中是由DBMS_BACKUP_RESTORE數據包來創建系統調用以備份數據文件,控制文件和歸檔的重做日誌文件,rman接收從dbms_rcvman數據包返回的信息,並在信道間基於負載均衡算法分配工作,然後創建一系列DBMS_BACKUP_RESTORE數據包的調用。

rman數據包還要一個重要的特性:他們被硬編碼到oracle軟件的庫文件中,因此即使沒有打開數據庫也能調用這些數據包。
rman可以在數據庫實例處於未加載模式或加載模式時編寫對DBMS_BACKUP_RESTORE數據的調用。這是一個關鍵要素,其原因顯而易見:需要在沒有打開數據庫時也能夠備份和還原這個數據庫。

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

c$>rman
rman>connect target /
rman>backup database;

rman生產連接到目標數據庫的連接,這就是說oracle會檢查oracle_sid的實例名,並在該實例上產生一個
服務器進程,然後作爲sys用戶登陸。這樣,我們被連接爲內部數據庫用戶sys,rman會立即產生一個用於備份的信道進程。
隨後,rman通過編譯一個對sysy.dbms_rcvman的調用。(從目標數據庫請求數據庫的結構信息,先確定目標數據庫的版本,rman從控制控制文件中收集版本信息和控制文件本身的信息,控制文件本身的信息包括控制文件類型,控制文件中的當前序列號,以及控制文件的創建時間)

由於指定了完整的備份,所以rman會請求數據庫中每個數據文件的信息。並且判斷是否存在離線數據文件。這些數據文件信息中包括每個數據文件所在磁盤和工作方式的信息。
 編譯了文件列表後,rman就準備開始執行備份過程,爲保證一致性,rman必須構建快照控制
文件。如果存在快照控制文件,則rman會將這個文件重寫爲新的快照控制文件。

接着,rman創建對DBMS_BACKUP_RESTORE數據包的調用。該調用可以創建備份片。(備份片在默認位置構建,linux默認位置ORACLE_HOME/dbs)

rman擁有文件列表,因此他可以爲磁盤讀取操作分配內存緩衝區。

分配了內存後,rman初始化備份片,備份片會得到一個唯一的默認名。隨後,rman開始備份。

一旦初始了備份片,信道進程就可以開始數據庫備份進程。rman會判斷是否使用了服務器參數文件。如果使用了,rman會自動將該文件備份爲備份集的一部分。rman還要在備份集中備份當前控制文件。只有備份了system表空間,就會自動備份當前控制文件。

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

一旦緩衝區被填滿,就會將輸出緩衝區中的內容轉儲到備份文件位置,由於rman緩衝區填充來自所有數據文件的數據塊,
所以在轉儲文件中的數據塊是雜亂無序的,轉儲文件只是一個存儲段,只有rman能夠在還原時將這些數據塊還原爲正確的位置,在備份片中寫入數據塊時。rman會生成最後一個對DBMS_BACKUP_RESTORE數據包的調用。該調用在控制文件中寫入備份信息,這些信息包括備份片名,自動備份操作時的檢查點的scn和完成備份操作的時間。

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