RMAN的備份原理
今天看了DAVE對RMAN的備份原理的講解,真的令我受益匪淺,之前只是能夠熟練地運用該工具,卻不知所以然。今天總算對RMAN的備份原理深入了一把。
以下是我個人對DAVE講的內容以及網上的文章的進行整理。
注:本文只對RMAN的備份原理進行探究,并不講到如何對數據庫進行備份。
RMAN的組成
RMAN是SMR(Server Managed Recovery:服務器管理恢復)的具體實現。
RMAN主要有兩部分組成:可執行文件rman.exe和recover.bsq文件
rman.exe和大部分exe文件一樣,是rman的啟動文件,如:
當我們執行rman target /,就是通過rman.exe連接上rman
recover.bsq文件實際上是庫文件,rman程序從recover.bsq文件中解析代碼來創建在目標數據庫上執行的PL/SQL調用。
比如我們在登錄rman后發出backup database,那么rman就會根據該語句在recover.bsq文件中解析出PL/SQL代碼塊,讓數據庫執行。
所以說rman只是起了協調作用,并不真正地干活。
RMAN的用戶權限
在oracle 11g中,rman是通過sys權限連入數據庫的
因為rman需要訪問目標數據庫上sys用戶,還需要有啟動和關閉數據的權限。
但是,平時我們直接在rman target /連接時候,就算rman不是sys權限也能連入,那是因為他跟sqlplus / as sysdba一樣,是操作系統認證。若是rman沒有sys權限,進行遠程連接,那么肯定會報權限不足的錯誤。
在12c中,rman權限又發生了改變。
RMAN與控制文件
1.rman通過直接讀取控制文件里面的信息
2.控制文件里面記錄了rman的備份信息
控制文件分為兩部分:
不可變部分
可變部分記錄的是數據文件,日志文件的路徑,文件名,表空間信息,數據庫名等等。這部分的數據是不會被覆蓋掉的。
RMAN就是通過讀取該部分信息,方便自己對數據庫進行備份恢復。
可變部分
當我們的RMAN是nocatalog方式的話,RMAN所備份的信息(包括備份的記錄,備份開始和結束時間的檢查點)就是記錄在這一部分之內,當然這一部分還記錄了很多其他信息。但是當這部分的信息滿了,外部還需要往這部分里面寫入數據,那么就需要覆蓋這里面的信息,包括RMAN的備份信息。這時為了我們的備份信息不被覆蓋,就需要設置下面的參數:
controlfile_record_keep_time:該參數是指定RMAN的備份信息在控制文件中多少天不被覆蓋。
show parameter control
SQL> show parameter control _file_record_keep_time
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
Oracle默認是為7天,但具體應該設置為多少天,應該根據我們生產過程中備份計劃來定。
快照控制文件
RMAN在備份的時候需要讀一個一致性的控制文件,但是控制文件是一個IO比較頻繁的文件,在備份過程中難免發生修改,若是我們在備份過程中鎖定了控制文件已達到這種目的,那就悲劇啦。數據庫的很多業務都會無法正常運行。
因此,Oracle通過快照控制文件來解決這個問題。
當我們用RMAN執行備份的時候,在$ORACLE/dbs下會產生一個快照控制文件。
[oracle@potato dbs]$ ll
total 9556
-rw-rw---- 1 oracle oinstall 1544 Jul 26 15:09 hc_orcl.dat
-rw-r--r-- 1 oracle oinstall 2851 May 15 2009 init.ora
-rw-r----- 1 oracle oinstall 24 Jul 26 15:13 lkORCL
-rw-r----- 1 oracle oinstall 1536 Jul 26 15:38 orapworcl
-rw-r----- 1 oracle oinstall 9748480 Jan 13 23:25 snapcf_orcl.f
-rw-r----- 1 oracle oinstall 2560 Jan 13 23:18 spfileorcl.ora
如上,snapcf_orcl.f便是快照控制文件,RMAN通過讀取該文件里信息來代替真的控制文件里的內容。有效地解決該問題。、
RMAN服務器進程
rman連接到目標庫的客戶端時會創建兩個服務器進程:
主要進程:生成對sys包的調用,從而執行備份和恢復操作,并協調工作。
次要進程:輪詢rman的長事務并在內部記錄信息。
RMAN所調用的兩個數據包
RMAN通道服務進程在協調工作時要訪問兩個sys數據包BMS_RCVMAN和DBMS_BACKUP_RESTORE,這倆包包含rman在目標庫操作的所有功能。
這兩個包是在創建數據庫時,運行cataproc.sql腳本安裝的,它們是被硬編碼到Oracle軟件的庫文件中的,所以即使沒有打開數據庫也能調用這些數據包。
SYS.DBMS_RCVMAN用來訪問控制文件并校驗所必須的信息,并將此信息傳遞給rman服務進程,rman服務進程會基于recover.bsq文件中的代碼創建pl/sql塊。這些pl/sql塊會調用SYS.DBMS_BACKUP_RESTORE,進行數據文件,控制文件的和歸檔的redo log的備份。備份集完成后,SYS.DBMS_BACKUP_RESTORE會往控制文件中記錄備份信息。
RMAN備份過程
備份開始后,建立一個通道進程(應為現在使用的是默認設置),因為沒有使用i/o從屬,通道程序會在pga中分配。rman主要進程通過編譯一個DBMS_RCVMAN調用,從目標庫控制文件解析出數據庫結構信息(確定目標庫版本和控制文件信息(類型,當前序列號,創建時間))。編譯文件列表后,之后RMAN便會創建快照控制文件,rman創建對DBMS_BACKUP_RESTORE的調用,并根據數據文件數分配輸入和輸出緩沖區(分配內存)。分配了內存后,rman初始化備份片,備份片得到了一個唯一的默認名字。當備份片初始化完成,通道進程開始數據庫備份。rman會判斷是需不需要對參數文件和控制文件進行備份。之后,rman創建對DBMS_BACKUP_RESTORE的調用,并根據數據文件數分配輸入和輸出緩沖區(分配內存)。分配了內存后,rman初始化備份片,備份片得到了一個唯一的默認名字。完成控文件制和spfile的備份,通道進程開始讀取數據文件并將數據塊輸入緩沖區到輸出緩沖區的內存對內存的寫操作。在這個寫操作期間,任滿會判斷塊是否被初始化或數據塊頭信息是否為零。如果塊用過(塊頭信息不為0,若是塊頭信息為0,該塊可以丟棄不寫,這也是RMAN的優點之一),rman會在這個塊上執行效驗操作。如塊頭和腳注不匹配,rman會指出存在訛誤的數據塊并終止備份。如通過數據塊被推入輸出緩沖區。 一般輸出緩沖區填滿,就會把輸出緩沖區的內容轉存到備份文件位置。當所有文件通過內存緩沖區過濾,就完成備份片,同時RMAN會在目標數據庫的控制文件中寫入備份信息。
注:以上部分內容來源于網絡。