作者介紹
顏廷義,中國(guó)農(nóng)業(yè)銀行研發(fā)中心系統(tǒng)支持部高級(jí)工程師,主要從事數(shù)據(jù)脫敏技術(shù)研究、數(shù)據(jù)庫(kù)管理與維護(hù)等相關(guān)工作。
Oracle 12C中一個(gè)重要特性多租戶特性被引入。12C之前,數(shù)據(jù)庫(kù)實(shí)例(Oracle Instance)與數(shù)據(jù)庫(kù)之間為多對(duì)一或一對(duì)一關(guān)系,若服務(wù)器上同時(shí)運(yùn)行多個(gè)Oracle數(shù)據(jù)庫(kù),必須同時(shí)運(yùn)行多個(gè)數(shù)據(jù)庫(kù)實(shí)例,資源耗費(fèi)非常大。
因此12C之前的版本中業(yè)務(wù)數(shù)據(jù)之間的隔離一般通過(guò)Schema-Tablespace模式實(shí)現(xiàn);而在12C多租戶體系中,一個(gè)數(shù)據(jù)庫(kù)實(shí)例下可以同時(shí)運(yùn)行和管理多個(gè)數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)在更高級(jí)別實(shí)現(xiàn)了數(shù)據(jù)的隔離。
本文以實(shí)際工作中具體數(shù)據(jù)申請(qǐng)為背景,對(duì)多租戶體系下數(shù)據(jù)庫(kù)的備份與恢復(fù)技術(shù)進(jìn)行研究,形成一套詳細(xì)、可用的數(shù)據(jù)備份、恢復(fù)方法,該方法既可為生產(chǎn)系統(tǒng)管理員日常備份與恢復(fù)提供參考,也值得數(shù)據(jù)恢復(fù)人員借鑒。
一、基本概念
1、多租戶架構(gòu)
Oracle 12C引入的新特性,主要包括多租戶容器數(shù)據(jù)庫(kù)(CDB)和可插拔數(shù)據(jù)庫(kù)(PDB)。
CDB容器庫(kù)是多租戶架構(gòu)下數(shù)據(jù)與元數(shù)據(jù)的邏輯容器,每個(gè)CDB由一個(gè)根容器(CDB$ROOT)、一個(gè)種子容器(PDB$SEED)和多個(gè)可插拔數(shù)據(jù)庫(kù)(PDB)組成,可以在不同的PDB庫(kù)中存放各個(gè)系統(tǒng)的業(yè)務(wù)數(shù)據(jù),實(shí)現(xiàn)業(yè)務(wù)數(shù)據(jù)的隔離。
每個(gè)PDB在CDB中是相互獨(dú)立存在的,在單獨(dú)使用PDB時(shí),與普通數(shù)據(jù)庫(kù)無(wú)區(qū)別。
2、RMAN
RMAN(Recovery Manager)是Oracle軟件自帶的備份與恢復(fù)工具,主要應(yīng)用于全庫(kù)或數(shù)據(jù)庫(kù)部件(如表空間,數(shù)據(jù)文件,控制文件等)進(jìn)行物理級(jí)備份與恢復(fù),備份方式一般分為全量備份和增量備份。
RMAN備份主要使用backup命令進(jìn)行,恢復(fù)包括restore和recover兩個(gè)過(guò)程,其中restore主要用于從備份集中將數(shù)據(jù)文件恢復(fù)至數(shù)據(jù)庫(kù)中,recover用于在restore基礎(chǔ)上使用日志重做事務(wù)。
3、表空間
表空間(TableSpace)是Oracle數(shù)據(jù)庫(kù)中的邏輯存儲(chǔ)結(jié)構(gòu),主要用于存放表,索引,視圖等數(shù)據(jù)庫(kù)對(duì)象。
在Oracle數(shù)據(jù)庫(kù)中,表空間由若干segment組成,segment包含若干extent,而一個(gè)extent又包含多個(gè)連續(xù)block。
數(shù)據(jù)文件是與表空間對(duì)應(yīng)的物理存儲(chǔ)結(jié)構(gòu),一個(gè)表空間一般包括一個(gè)或多個(gè)數(shù)據(jù)文件。
4、SCN
SCN(System Change Number)系統(tǒng)改變號(hào),Oracle數(shù)據(jù)庫(kù)中內(nèi)置的時(shí)間機(jī)制,主要用于記錄檢查點(diǎn)(checkpoint)、事務(wù)提交(commit)等重要事件發(fā)生的時(shí)間及先后順序,SCN值主要存放在控制文件、數(shù)據(jù)文件頭以及日志文件中,在數(shù)據(jù)庫(kù)備份、恢復(fù)與管理過(guò)程中起重要作用。
5、控制文件(control file)
Oracle數(shù)據(jù)庫(kù)中最重要的物理文件,記錄了數(shù)據(jù)庫(kù)的物理結(jié)構(gòu)(如數(shù)據(jù)文件、日志文件的名稱與具體存儲(chǔ)位置)、檢查點(diǎn)等信息,控制文件在數(shù)據(jù)庫(kù)啟動(dòng)、運(yùn)行及恢復(fù)時(shí)起到很重要的作用。
鑒于其重要性,為防止控制文件損壞或丟失,強(qiáng)烈建議在數(shù)據(jù)庫(kù)中存儲(chǔ)多份備份。
二、問(wèn)題背景與分析
1、問(wèn)題背景
作者在受理測(cè)試數(shù)據(jù)申請(qǐng)時(shí)遇到數(shù)據(jù)恢復(fù)失敗問(wèn)題,當(dāng)按單租戶數(shù)據(jù)庫(kù)的恢復(fù)方法將生產(chǎn)數(shù)據(jù)恢復(fù)至脫敏環(huán)境時(shí)遇到大量報(bào)錯(cuò),具體恢復(fù)腳本與報(bào)錯(cuò)信息如下,由于篇幅問(wèn)題,在此只列出關(guān)鍵步驟:
RMAN>
run{
startup nomount pfile=/tmp/initPOOL1DB.ora ;(參數(shù)文件存放目錄為/tmp/initPOOL1DB.ora)
restore controlfile from ‘/data/backup/itapdb.cf’;
alter database mount;
catalog start with ’/data/backup/’;
set newname for database to '/data/itapdb/%U';-------------->指定恢復(fù)路徑
restore database ;
switch datafile all ;
recover database;
}
RMAN-03002: failure of restore command at 01/25/2018 17:39:54
RMAN-06026: some targets not found - aborting restore
RMAN-06023: no backup or copy of datafile 99 found to restore
RMAN-06023: no backup or copy of datafile 98 found to restore
RMAN-06023: no backup or copy of datafile 67 found to restore
從報(bào)錯(cuò)信息判斷似乎是一些數(shù)據(jù)文件找不到,在反復(fù)確定恢復(fù)操作無(wú)誤后初步判斷是備份數(shù)據(jù)不全導(dǎo)致。
在與生產(chǎn)系統(tǒng)管理員多次溝通后得知該項(xiàng)目生產(chǎn)上部署在Oracle12C的多租戶架構(gòu)下,具體生產(chǎn)部署架構(gòu)如下所示:

生產(chǎn)系統(tǒng)多租戶部署架構(gòu)
從上圖中可以看出,項(xiàng)目(圖中ITAPDB庫(kù))與其他多個(gè)項(xiàng)目部署在多租戶架構(gòu)下,每一個(gè)系統(tǒng)的業(yè)務(wù)數(shù)據(jù)分別存放在各自獨(dú)立的PDB數(shù)據(jù)庫(kù)中,所有PDB由一個(gè)容器庫(kù)(CDB)來(lái)管理,共享計(jì)算資源,生產(chǎn)管理員只負(fù)責(zé)備份自己管理的PDB數(shù)據(jù),主要備份腳本如下:
RMAN>backup as compressed backupset pluggable database itapdb format '/new/%d_itapdb_%t_%U_%p';
RMAN>backup archivelog all format '/new/arch%t_%s_%p';
RMAN>backup current controlfile format '/new/cf_%U';
2、問(wèn)題分析
從多租戶架構(gòu)的定義知道,所有PDB共享一個(gè)數(shù)據(jù)庫(kù)實(shí)例、一份控制文件、一份在線REDO日志文件和一組UNDO撤銷數(shù)據(jù)文件。
在控制文件中記錄了所有數(shù)據(jù)文件的記錄和數(shù)據(jù)庫(kù)的物理性更改(如新建表空間、數(shù)據(jù)文件備份、檢查點(diǎn)發(fā)生的SCN等)。
當(dāng)執(zhí)行restore database、recover database操作進(jìn)行全庫(kù)恢復(fù)時(shí),由于備份數(shù)據(jù)只包括ITAPDB數(shù)據(jù)庫(kù)的備份文件,那么恢復(fù)時(shí)自然會(huì)報(bào)數(shù)據(jù)文件找不到錯(cuò)誤。
為了驗(yàn)證分析,首先查詢控制文件中包含哪些數(shù)據(jù)文件:
RMAN> report schema;
從查詢結(jié)果發(fā)現(xiàn)報(bào)錯(cuò)信息中找不到的數(shù)據(jù)文件編號(hào)都是其他項(xiàng)目PDB數(shù)據(jù)庫(kù)中的數(shù)據(jù)文件,再查詢v$datafile_header動(dòng)態(tài)視圖:
SQL> select FILE#,CHECKPOINT_CHANGE# from v$datafile_header;
可以發(fā)現(xiàn)ITAPDB庫(kù)的相關(guān)數(shù)據(jù)文件的文件頭Checkpoint SCN值已經(jīng)變化,而其他庫(kù)的數(shù)據(jù)文件頭SCN為零,這說(shuō)明ITAPDB庫(kù)的相關(guān)數(shù)據(jù)文件已經(jīng)完成restore操作,SCN值已經(jīng)恢復(fù)到備份時(shí)的SCN,而其他PDB庫(kù)由于缺少數(shù)據(jù)文件備份,restore時(shí)報(bào)錯(cuò),因此SCN值還為0,這進(jìn)一步驗(yàn)證了分析的正確性。
對(duì)于上面的分析,有如下思考:
① 前面章節(jié)提到,在CDB容器庫(kù)中包括一個(gè)CDB$ROOT、一個(gè)PDB$SEED和多個(gè)PDB數(shù)據(jù)庫(kù),其中CDB$ROOT庫(kù)主要用于存儲(chǔ)元數(shù)據(jù)等管理數(shù)據(jù),PDB$SEED庫(kù)是只讀種子庫(kù),主要作為模板為其他PDB庫(kù)建立時(shí)提供模板。那么CDB$ROOT、PDB$SEED兩個(gè)庫(kù)的備份數(shù)據(jù)是否是數(shù)據(jù)恢復(fù)必需的?
② 控制文件中記錄了所有多租戶架構(gòu)下的數(shù)據(jù)文件、表空間等信息,當(dāng)只恢復(fù)ITAPDB數(shù)據(jù)庫(kù)時(shí)是否可以采用顯示跳過(guò)方式規(guī)避掉其他不需要恢復(fù)的數(shù)據(jù)文件?
三、多租戶備份、恢復(fù)方法研究
帶著上面的疑問(wèn),經(jīng)過(guò)多次數(shù)據(jù)恢復(fù)測(cè)試、問(wèn)題查找與研究,我們總結(jié)出一整套Oracle 12C多租戶數(shù)據(jù)庫(kù)的備份、恢復(fù)方法,具體步驟如下:
① 首先聯(lián)系生產(chǎn)管理員對(duì)CDB$ROOT、PDB$SEED和ITAPDB三個(gè)庫(kù)重新進(jìn)行備份,而不再只備份ITAPDB數(shù)據(jù)庫(kù)的數(shù)據(jù),備份腳本變?yōu)椋?/p>
RMAN>backup as compressed backupset pluggable database "CDB$ROOT","PDB$SEED",itapdb format '/new/%d_itapdb_%t_%U_%p';
RMAN>backup archivelog all format '/new/arch%t_%s_%p';
RMAN>backup current controlfile format '/new/cf_%U';
之后將將備份數(shù)據(jù)放置到脫敏環(huán)境指定目錄下(為便于后面說(shuō)明,假設(shè)目錄為/data/backup)。
② 創(chuàng)建數(shù)據(jù)庫(kù)參數(shù)文件并啟動(dòng)至nomount狀態(tài)。
參數(shù)文件中一般需要制定如下參數(shù):
Control_files
Sga_target
Db_name
Compatible
Diagnostic_dest
SQL> startup nomount pfile=/tmp/initPOOL1DB.ora ;(參數(shù)文件存放目錄為/tmp/initPOOL1DB.ora)
③ 恢復(fù)控制文件并將數(shù)據(jù)庫(kù)啟動(dòng)到mount狀態(tài)。
Rman> restore controlfile from ‘/data/backup/itapdb.cf’;
Rman> alter database mount;
④ 重新編目控制文件。
Rman>catalog start with ’/data/backup/’;
說(shuō)明:由于生產(chǎn)系統(tǒng)部署在ASM存儲(chǔ)+RAC架構(gòu)下,而脫敏環(huán)境為本地磁盤+非RAC架構(gòu),生產(chǎn)與恢復(fù)環(huán)境的數(shù)據(jù)存放目錄不一致,需要將備份文件編目至控制文件中。
⑤ 執(zhí)行restore恢復(fù)數(shù)據(jù)文件。
在開始restore恢復(fù)數(shù)據(jù)文件之前,可以使用crosscheck命令對(duì)備份集有效性進(jìn)行檢查,對(duì)于在控制文件中記錄而在數(shù)據(jù)庫(kù)服務(wù)器上沒(méi)有存儲(chǔ)的備份集會(huì)被標(biāo)記為expired狀態(tài)。
Rman>crosscheck backup;
之后開始進(jìn)行三個(gè)庫(kù)的數(shù)據(jù)文件恢復(fù),命令如下:
Rman>run{
set newname for database to '/data/itapdb/%U';-------------->指定恢復(fù)路徑
restore database root ; ----------------->CDB$ROOT
restore database "PDB$SEED"; ------------->PDB$SEED
restore database ITAPDB; --------------->ITAPDB
switch datafile all ;
}
⑥ 使用歸檔日志進(jìn)行數(shù)據(jù)恢復(fù)。
與單租戶數(shù)據(jù)恢復(fù)不同,由于控制文件中記錄了所有PDB數(shù)據(jù)庫(kù)及其表空間信息,如果在恢復(fù)時(shí)不跳過(guò)相應(yīng)PDB對(duì)應(yīng)的表空間,使用recover database恢復(fù)會(huì)報(bào)如下錯(cuò)誤:
RMAN-06067: RECOVER DATABASE required with a backup or created control file
通過(guò)顯式跳過(guò),可以offline并drop掉不需要恢復(fù)的PDB和對(duì)應(yīng)的表空間。具體恢復(fù)方法如下:
Rman> Run {
recover database skip forever tablespace
PDB2:SYSTEM,
PDB2:USER,
PDB2:SYSAUX,..... ; ----此處需要根據(jù)具體情況進(jìn)行修改
}
此外在恢復(fù)過(guò)程中可能會(huì)遇到restore或recover過(guò)程緩慢甚至停滯的問(wèn)題,主要表現(xiàn)為在alert<SID>.log日志文件中報(bào)大量ASMB進(jìn)程錯(cuò)誤,該問(wèn)題主要由Oracle bug導(dǎo)致,觸發(fā)條件一般為生產(chǎn)上部署架構(gòu)(ASM+RAC)與數(shù)據(jù)恢復(fù)環(huán)境(非RAC+本地磁盤)部署架構(gòu)不一致導(dǎo)致,針對(duì)該問(wèn)題可登錄MOS網(wǎng)站(My Oracle Support)下載相應(yīng)補(bǔ)丁并進(jìn)行打補(bǔ)丁操作。
啟動(dòng)數(shù)據(jù)庫(kù):
Rman> Alter database open resetlogs ;
最后通過(guò)resetlogs方式啟動(dòng)數(shù)據(jù)庫(kù),至此數(shù)據(jù)恢復(fù)成功。
四、問(wèn)題總結(jié)
本文就測(cè)試數(shù)據(jù)申請(qǐng)中遇到的具體問(wèn)題為切入點(diǎn),對(duì)Oracle12C多租戶架構(gòu)下的備份與還原方法進(jìn)行了研究和總結(jié),從整個(gè)過(guò)程來(lái)看,其備份與恢復(fù)方法與單租戶架構(gòu)恢復(fù)有較大差異,具體差異主要體現(xiàn)在以下三個(gè)方面:
① 在數(shù)據(jù)備份方面,除需備份存放有業(yè)務(wù)數(shù)據(jù)的PDB數(shù)據(jù)庫(kù)外,也許備份CDB$ROOT和PDB$SEED庫(kù)。
② 在restore恢復(fù)數(shù)據(jù)文件階段,由于多個(gè)PDB可插拔數(shù)據(jù)庫(kù)共用一份控制文件及存儲(chǔ)與計(jì)算資源,需在數(shù)據(jù)恢復(fù)時(shí)顯示指定需恢復(fù)的數(shù)據(jù)庫(kù)。
③ 在使用日志文件進(jìn)行數(shù)據(jù)恢復(fù)的過(guò)程中,需要使用recover database skip forever tablespace命令顯示跳過(guò)不需恢復(fù)的PDB對(duì)應(yīng)表空間。
目前,考慮到生產(chǎn)系統(tǒng)的重要性,生產(chǎn)系統(tǒng)基本都部署在物理機(jī)+RAC集群環(huán)境中。
若為數(shù)據(jù)量較小項(xiàng)目單獨(dú)提供物理機(jī)+RAC環(huán)境勢(shì)必會(huì)對(duì)服務(wù)器資源提出更高的要求。
Oracle 12C多租戶體系特性可以在一定程度上解決服務(wù)器資源瓶頸的問(wèn)題,可以考慮將多個(gè)數(shù)據(jù)量較小項(xiàng)目部署在多租戶架構(gòu)下,每個(gè)PDB數(shù)據(jù)庫(kù)獨(dú)立存放各自的業(yè)務(wù)數(shù)據(jù),多個(gè)PDB數(shù)據(jù)庫(kù)共享一個(gè)實(shí)例。
后期在Oracle多租戶逐漸成為主流的情況下,該方法具有較強(qiáng)的前瞻性,對(duì)Oracle數(shù)據(jù)庫(kù)的管理與維護(hù)是一個(gè)很好的補(bǔ)充,很值得生產(chǎn)管理員、數(shù)據(jù)導(dǎo)入與脫敏人員的借鑒。