RMAN的備份原理
今天看了DAVE對(duì)RMAN的備份原理的講解,真的令我受益匪淺,之前只是能夠熟練地運(yùn)用該工具,卻不知所以然。今天總算對(duì)RMAN的備份原理深入了一把。
以下是我個(gè)人對(duì)DAVE講的內(nèi)容以及網(wǎng)上的文章的進(jìn)行整理。
注:本文只對(duì)RMAN的備份原理進(jìn)行探究,并不講到如何對(duì)數(shù)據(jù)庫(kù)進(jìn)行備份。
RMAN的組成
RMAN是SMR(Server Managed Recovery:服務(wù)器管理恢復(fù))的具體實(shí)現(xiàn)。
RMAN主要有兩部分組成:可執(zhí)行文件rman.exe和recover.bsq文件
rman.exe和大部分exe文件一樣,是rman的啟動(dòng)文件,如:
當(dāng)我們執(zhí)行rman target /,就是通過(guò)rman.exe連接上rman
recover.bsq文件實(shí)際上是庫(kù)文件,rman程序從recover.bsq文件中解析代碼來(lái)創(chuàng)建在目標(biāo)數(shù)據(jù)庫(kù)上執(zhí)行的PL/SQL調(diào)用。
比如我們?cè)诘卿況man后發(fā)出backup database,那么rman就會(huì)根據(jù)該語(yǔ)句在recover.bsq文件中解析出PL/SQL代碼塊,讓數(shù)據(jù)庫(kù)執(zhí)行。
所以說(shuō)rman只是起了協(xié)調(diào)作用,并不真正地干活。
RMAN的用戶權(quán)限
在oracle 11g中,rman是通過(guò)sys權(quán)限連入數(shù)據(jù)庫(kù)的
因?yàn)閞man需要訪問(wèn)目標(biāo)數(shù)據(jù)庫(kù)上sys用戶,還需要有啟動(dòng)和關(guān)閉數(shù)據(jù)的權(quán)限。
但是,平時(shí)我們直接在rman target /連接時(shí)候,就算rman不是sys權(quán)限也能連入,那是因?yàn)樗鷖qlplus / as sysdba一樣,是操作系統(tǒng)認(rèn)證。若是rman沒(méi)有sys權(quán)限,進(jìn)行遠(yuǎn)程連接,那么肯定會(huì)報(bào)權(quán)限不足的錯(cuò)誤。
在12c中,rman權(quán)限又發(fā)生了改變。
RMAN與控制文件
1.rman通過(guò)直接讀取控制文件里面的信息
2.控制文件里面記錄了rman的備份信息
控制文件分為兩部分:
不可變部分
可變部分記錄的是數(shù)據(jù)文件,日志文件的路徑,文件名,表空間信息,數(shù)據(jù)庫(kù)名等等。這部分的數(shù)據(jù)是不會(huì)被覆蓋掉的。
RMAN就是通過(guò)讀取該部分信息,方便自己對(duì)數(shù)據(jù)庫(kù)進(jìn)行備份恢復(fù)。
可變部分
當(dāng)我們的RMAN是nocatalog方式的話,RMAN所備份的信息(包括備份的記錄,備份開(kāi)始和結(jié)束時(shí)間的檢查點(diǎn))就是記錄在這一部分之內(nèi),當(dāng)然這一部分還記錄了很多其他信息。但是當(dāng)這部分的信息滿了,外部還需要往這部分里面寫(xiě)入數(shù)據(jù),那么就需要覆蓋這里面的信息,包括RMAN的備份信息。這時(shí)為了我們的備份信息不被覆蓋,就需要設(shè)置下面的參數(shù):
controlfile_record_keep_time:該參數(shù)是指定RMAN的備份信息在控制文件中多少天不被覆蓋。
show parameter control
SQL> show parameter control _file_record_keep_time
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
Oracle默認(rèn)是為7天,但具體應(yīng)該設(shè)置為多少天,應(yīng)該根據(jù)我們生產(chǎn)過(guò)程中備份計(jì)劃來(lái)定。
快照控制文件
RMAN在備份的時(shí)候需要讀一個(gè)一致性的控制文件,但是控制文件是一個(gè)IO比較頻繁的文件,在備份過(guò)程中難免發(fā)生修改,若是我們?cè)趥浞葸^(guò)程中鎖定了控制文件已達(dá)到這種目的,那就悲劇啦。數(shù)據(jù)庫(kù)的很多業(yè)務(wù)都會(huì)無(wú)法正常運(yùn)行。
因此,Oracle通過(guò)快照控制文件來(lái)解決這個(gè)問(wèn)題。
當(dāng)我們用RMAN執(zhí)行備份的時(shí)候,在$ORACLE/dbs下會(huì)產(chǎn)生一個(gè)快照控制文件。
[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通過(guò)讀取該文件里信息來(lái)代替真的控制文件里的內(nèi)容。有效地解決該問(wèn)題。、
RMAN服務(wù)器進(jìn)程
rman連接到目標(biāo)庫(kù)的客戶端時(shí)會(huì)創(chuàng)建兩個(gè)服務(wù)器進(jìn)程:
主要進(jìn)程:生成對(duì)sys包的調(diào)用,從而執(zhí)行備份和恢復(fù)操作,并協(xié)調(diào)工作。
次要進(jìn)程:輪詢r(jià)man的長(zhǎng)事務(wù)并在內(nèi)部記錄信息。
RMAN所調(diào)用的兩個(gè)數(shù)據(jù)包
RMAN通道服務(wù)進(jìn)程在協(xié)調(diào)工作時(shí)要訪問(wèn)兩個(gè)sys數(shù)據(jù)包BMS_RCVMAN和DBMS_BACKUP_RESTORE,這倆包包含rman在目標(biāo)庫(kù)操作的所有功能。
這兩個(gè)包是在創(chuàng)建數(shù)據(jù)庫(kù)時(shí),運(yùn)行cataproc.sql腳本安裝的,它們是被硬編碼到Oracle軟件的庫(kù)文件中的,所以即使沒(méi)有打開(kāi)數(shù)據(jù)庫(kù)也能調(diào)用這些數(shù)據(jù)包。
SYS.DBMS_RCVMAN用來(lái)訪問(wèn)控制文件并校驗(yàn)所必須的信息,并將此信息傳遞給rman服務(wù)進(jìn)程,rman服務(wù)進(jìn)程會(huì)基于recover.bsq文件中的代碼創(chuàng)建pl/sql塊。這些pl/sql塊會(huì)調(diào)用SYS.DBMS_BACKUP_RESTORE,進(jìn)行數(shù)據(jù)文件,控制文件的和歸檔的redo log的備份。備份集完成后,SYS.DBMS_BACKUP_RESTORE會(huì)往控制文件中記錄備份信息。
RMAN備份過(guò)程
備份開(kāi)始后,建立一個(gè)通道進(jìn)程(應(yīng)為現(xiàn)在使用的是默認(rèn)設(shè)置),因?yàn)闆](méi)有使用i/o從屬,通道程序會(huì)在pga中分配。rman主要進(jìn)程通過(guò)編譯一個(gè)DBMS_RCVMAN調(diào)用,從目標(biāo)庫(kù)控制文件解析出數(shù)據(jù)庫(kù)結(jié)構(gòu)信息(確定目標(biāo)庫(kù)版本和控制文件信息(類型,當(dāng)前序列號(hào),創(chuàng)建時(shí)間))。編譯文件列表后,之后RMAN便會(huì)創(chuàng)建快照控制文件,rman創(chuàng)建對(duì)DBMS_BACKUP_RESTORE的調(diào)用,并根據(jù)數(shù)據(jù)文件數(shù)分配輸入和輸出緩沖區(qū)(分配內(nèi)存)。分配了內(nèi)存后,rman初始化備份片,備份片得到了一個(gè)唯一的默認(rèn)名字。當(dāng)備份片初始化完成,通道進(jìn)程開(kāi)始數(shù)據(jù)庫(kù)備份。rman會(huì)判斷是需不需要對(duì)參數(shù)文件和控制文件進(jìn)行備份。之后,rman創(chuàng)建對(duì)DBMS_BACKUP_RESTORE的調(diào)用,并根據(jù)數(shù)據(jù)文件數(shù)分配輸入和輸出緩沖區(qū)(分配內(nèi)存)。分配了內(nèi)存后,rman初始化備份片,備份片得到了一個(gè)唯一的默認(rèn)名字。完成控文件制和spfile的備份,通道進(jìn)程開(kāi)始讀取數(shù)據(jù)文件并將數(shù)據(jù)塊輸入緩沖區(qū)到輸出緩沖區(qū)的內(nèi)存對(duì)內(nèi)存的寫(xiě)操作。在這個(gè)寫(xiě)操作期間,任滿會(huì)判斷塊是否被初始化或數(shù)據(jù)塊頭信息是否為零。如果塊用過(guò)(塊頭信息不為0,若是塊頭信息為0,該塊可以丟棄不寫(xiě),這也是RMAN的優(yōu)點(diǎn)之一),rman會(huì)在這個(gè)塊上執(zhí)行效驗(yàn)操作。如塊頭和腳注不匹配,rman會(huì)指出存在訛誤的數(shù)據(jù)塊并終止備份。如通過(guò)數(shù)據(jù)塊被推入輸出緩沖區(qū)。 一般輸出緩沖區(qū)填滿,就會(huì)把輸出緩沖區(qū)的內(nèi)容轉(zhuǎn)存到備份文件位置。當(dāng)所有文件通過(guò)內(nèi)存緩沖區(qū)過(guò)濾,就完成備份片,同時(shí)RMAN會(huì)在目標(biāo)數(shù)據(jù)庫(kù)的控制文件中寫(xiě)入備份信息。
注:以上部分內(nèi)容來(lái)源于網(wǎng)絡(luò)。