作者介紹
顏廷義,中國農業銀行研發中心系統支持部高級工程師,主要從事數據脫敏技術研究、數據庫管理與維護等相關工作。
Oracle 12C中一個重要特性多租戶特性被引入。12C之前,數據庫實例(Oracle Instance)與數據庫之間為多對一或一對一關系,若服務器上同時運行多個Oracle數據庫,必須同時運行多個數據庫實例,資源耗費非常大。
因此12C之前的版本中業務數據之間的隔離一般通過Schema-Tablespace模式實現;而在12C多租戶體系中,一個數據庫實例下可以同時運行和管理多個數據庫,數據庫在更高級別實現了數據的隔離。
本文以實際工作中具體數據申請為背景,對多租戶體系下數據庫的備份與恢復技術進行研究,形成一套詳細、可用的數據備份、恢復方法,該方法既可為生產系統管理員日常備份與恢復提供參考,也值得數據恢復人員借鑒。
一、基本概念
1、多租戶架構
Oracle 12C引入的新特性,主要包括多租戶容器數據庫(CDB)和可插拔數據庫(PDB)。
CDB容器庫是多租戶架構下數據與元數據的邏輯容器,每個CDB由一個根容器(CDB$ROOT)、一個種子容器(PDB$SEED)和多個可插拔數據庫(PDB)組成,可以在不同的PDB庫中存放各個系統的業務數據,實現業務數據的隔離。
每個PDB在CDB中是相互獨立存在的,在單獨使用PDB時,與普通數據庫無區別。
2、RMAN
RMAN(Recovery Manager)是Oracle軟件自帶的備份與恢復工具,主要應用于全庫或數據庫部件(如表空間,數據文件,控制文件等)進行物理級備份與恢復,備份方式一般分為全量備份和增量備份。
RMAN備份主要使用backup命令進行,恢復包括restore和recover兩個過程,其中restore主要用于從備份集中將數據文件恢復至數據庫中,recover用于在restore基礎上使用日志重做事務。
3、表空間
表空間(TableSpace)是Oracle數據庫中的邏輯存儲結構,主要用于存放表,索引,視圖等數據庫對象。
在Oracle數據庫中,表空間由若干segment組成,segment包含若干extent,而一個extent又包含多個連續block。
數據文件是與表空間對應的物理存儲結構,一個表空間一般包括一個或多個數據文件。
4、SCN
SCN(System Change Number)系統改變號,Oracle數據庫中內置的時間機制,主要用于記錄檢查點(checkpoint)、事務提交(commit)等重要事件發生的時間及先后順序,SCN值主要存放在控制文件、數據文件頭以及日志文件中,在數據庫備份、恢復與管理過程中起重要作用。
5、控制文件(control file)
Oracle數據庫中最重要的物理文件,記錄了數據庫的物理結構(如數據文件、日志文件的名稱與具體存儲位置)、檢查點等信息,控制文件在數據庫啟動、運行及恢復時起到很重要的作用。
鑒于其重要性,為防止控制文件損壞或丟失,強烈建議在數據庫中存儲多份備份。
二、問題背景與分析
1、問題背景
作者在受理測試數據申請時遇到數據恢復失敗問題,當按單租戶數據庫的恢復方法將生產數據恢復至脫敏環境時遇到大量報錯,具體恢復腳本與報錯信息如下,由于篇幅問題,在此只列出關鍵步驟:
RMAN>
run{
startup nomount pfile=/tmp/initPOOL1DB.ora ;(參數文件存放目錄為/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';-------------->指定恢復路徑
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
從報錯信息判斷似乎是一些數據文件找不到,在反復確定恢復操作無誤后初步判斷是備份數據不全導致。
在與生產系統管理員多次溝通后得知該項目生產上部署在Oracle12C的多租戶架構下,具體生產部署架構如下所示:
生產系統多租戶部署架構
從上圖中可以看出,項目(圖中ITAPDB庫)與其他多個項目部署在多租戶架構下,每一個系統的業務數據分別存放在各自獨立的PDB數據庫中,所有PDB由一個容器庫(CDB)來管理,共享計算資源,生產管理員只負責備份自己管理的PDB數據,主要備份腳本如下:
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、問題分析
從多租戶架構的定義知道,所有PDB共享一個數據庫實例、一份控制文件、一份在線REDO日志文件和一組UNDO撤銷數據文件。
在控制文件中記錄了所有數據文件的記錄和數據庫的物理性更改(如新建表空間、數據文件備份、檢查點發生的SCN等)。
當執行restore database、recover database操作進行全庫恢復時,由于備份數據只包括ITAPDB數據庫的備份文件,那么恢復時自然會報數據文件找不到錯誤。
為了驗證分析,首先查詢控制文件中包含哪些數據文件:
RMAN> report schema;
從查詢結果發現報錯信息中找不到的數據文件編號都是其他項目PDB數據庫中的數據文件,再查詢v$datafile_header動態視圖:
SQL> select FILE#,CHECKPOINT_CHANGE# from v$datafile_header;
可以發現ITAPDB庫的相關數據文件的文件頭Checkpoint SCN值已經變化,而其他庫的數據文件頭SCN為零,這說明ITAPDB庫的相關數據文件已經完成restore操作,SCN值已經恢復到備份時的SCN,而其他PDB庫由于缺少數據文件備份,restore時報錯,因此SCN值還為0,這進一步驗證了分析的正確性。
對于上面的分析,有如下思考:
① 前面章節提到,在CDB容器庫中包括一個CDB$ROOT、一個PDB$SEED和多個PDB數據庫,其中CDB$ROOT庫主要用于存儲元數據等管理數據,PDB$SEED庫是只讀種子庫,主要作為模板為其他PDB庫建立時提供模板。那么CDB$ROOT、PDB$SEED兩個庫的備份數據是否是數據恢復必需的?
② 控制文件中記錄了所有多租戶架構下的數據文件、表空間等信息,當只恢復ITAPDB數據庫時是否可以采用顯示跳過方式規避掉其他不需要恢復的數據文件?
三、多租戶備份、恢復方法研究
帶著上面的疑問,經過多次數據恢復測試、問題查找與研究,我們總結出一整套Oracle 12C多租戶數據庫的備份、恢復方法,具體步驟如下:
① 首先聯系生產管理員對CDB$ROOT、PDB$SEED和ITAPDB三個庫重新進行備份,而不再只備份ITAPDB數據庫的數據,備份腳本變為:
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';
之后將將備份數據放置到脫敏環境指定目錄下(為便于后面說明,假設目錄為/data/backup)。
② 創建數據庫參數文件并啟動至nomount狀態。
參數文件中一般需要制定如下參數:
Control_files
Sga_target
Db_name
Compatible
Diagnostic_dest
SQL> startup nomount pfile=/tmp/initPOOL1DB.ora ;(參數文件存放目錄為/tmp/initPOOL1DB.ora)
③ 恢復控制文件并將數據庫啟動到mount狀態。
Rman> restore controlfile from ‘/data/backup/itapdb.cf’;
Rman> alter database mount;
④ 重新編目控制文件。
Rman>catalog start with ’/data/backup/’;
說明:由于生產系統部署在ASM存儲+RAC架構下,而脫敏環境為本地磁盤+非RAC架構,生產與恢復環境的數據存放目錄不一致,需要將備份文件編目至控制文件中。
⑤ 執行restore恢復數據文件。
在開始restore恢復數據文件之前,可以使用crosscheck命令對備份集有效性進行檢查,對于在控制文件中記錄而在數據庫服務器上沒有存儲的備份集會被標記為expired狀態。
Rman>crosscheck backup;
之后開始進行三個庫的數據文件恢復,命令如下:
Rman>run{
set newname for database to '/data/itapdb/%U';-------------->指定恢復路徑
restore database root ; ----------------->CDB$ROOT
restore database "PDB$SEED"; ------------->PDB$SEED
restore database ITAPDB; --------------->ITAPDB
switch datafile all ;
}
⑥ 使用歸檔日志進行數據恢復。
與單租戶數據恢復不同,由于控制文件中記錄了所有PDB數據庫及其表空間信息,如果在恢復時不跳過相應PDB對應的表空間,使用recover database恢復會報如下錯誤:
RMAN-06067: RECOVER DATABASE required with a backup or created control file
通過顯式跳過,可以offline并drop掉不需要恢復的PDB和對應的表空間。具體恢復方法如下:
Rman> Run {
recover database skip forever tablespace
PDB2:SYSTEM,
PDB2:USER,
PDB2:SYSAUX,..... ; ----此處需要根據具體情況進行修改
}
此外在恢復過程中可能會遇到restore或recover過程緩慢甚至停滯的問題,主要表現為在alert<SID>.log日志文件中報大量ASMB進程錯誤,該問題主要由Oracle bug導致,觸發條件一般為生產上部署架構(ASM+RAC)與數據恢復環境(非RAC+本地磁盤)部署架構不一致導致,針對該問題可登錄MOS網站(My Oracle Support)下載相應補丁并進行打補丁操作。
啟動數據庫:
Rman> Alter database open resetlogs ;
最后通過resetlogs方式啟動數據庫,至此數據恢復成功。
四、問題總結
本文就測試數據申請中遇到的具體問題為切入點,對Oracle12C多租戶架構下的備份與還原方法進行了研究和總結,從整個過程來看,其備份與恢復方法與單租戶架構恢復有較大差異,具體差異主要體現在以下三個方面:
① 在數據備份方面,除需備份存放有業務數據的PDB數據庫外,也許備份CDB$ROOT和PDB$SEED庫。
② 在restore恢復數據文件階段,由于多個PDB可插拔數據庫共用一份控制文件及存儲與計算資源,需在數據恢復時顯示指定需恢復的數據庫。
③ 在使用日志文件進行數據恢復的過程中,需要使用recover database skip forever tablespace命令顯示跳過不需恢復的PDB對應表空間。
目前,考慮到生產系統的重要性,生產系統基本都部署在物理機+RAC集群環境中。
若為數據量較小項目單獨提供物理機+RAC環境勢必會對服務器資源提出更高的要求。
Oracle 12C多租戶體系特性可以在一定程度上解決服務器資源瓶頸的問題,可以考慮將多個數據量較小項目部署在多租戶架構下,每個PDB數據庫獨立存放各自的業務數據,多個PDB數據庫共享一個實例。
后期在Oracle多租戶逐漸成為主流的情況下,該方法具有較強的前瞻性,對Oracle數據庫的管理與維護是一個很好的補充,很值得生產管理員、數據導入與脫敏人員的借鑒。