閱讀157 返回首頁    go 小米 go 小米5


Oracle 12c多租戶特性詳解:從Schema到PDB的變化與隔離

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy

(題圖來自Oracle VP , Sally Piao的攝影佳作,感謝攝影師授權)

編輯手記:Oracle 12c的多租戶特性是Oracle Database曆史上最重要的革新之一,在雲時代這一特性展現出強大的整合威力,這篇文章來自<深入解析Oracle>一書的摘錄。


在Oracle Database 12c版本中,一個重要的新特性:插接式數據庫(Pluggable Database)被引入進來。在12c之前的版本中,Oracle數據庫中的多用戶管理通過Schema – 模式管理方式來實現,而在12c中,插接式數據庫在更高級別實現了進一步的隔離。


1. 插接式數據簡介


插接式數據庫由一個使用 CDB(Container Database)選項創建的容器數據庫和一個或多個 PDB(Pluggable Database)組成,CDB 作為容器容納 PDB,而 PDB 彼此隔離,就像一個獨立的數據庫般在 CDB 中存在。

 

CDB 需要在創建數據庫時指定選項,如下圖所示,必須選擇“創建為容器數據庫”選項,然後才能夠在其中創建 PDB,在 CDB 之外的常規數據庫中是不能夠包含 PDB 的。以下頁麵中,選擇包含了1個 PluggableDatabase,CDB 和 PDB 的名稱就在這個頁麵分別指定:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


在完成 CDB 的創建之後,可以登陸到數據庫,查詢數據庫的創建模式,在 v$database 和 v$instance 視圖中都可以找到相應信息,CDB 為 YES 顯示該數據庫為 CDB 模式:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


PDB 是一組 Schema 的集合,在 CDB 中作為一個獨立的組件容器而存在。從這個意義上說,PDB 也是一種容器(Container), 而 CDB 中可以存在多種不同類型的容器。


2. CDB 的組成

 

每個 CDB 通常包含如下容器(Container):


 ① ROOT

Root 是一個係統提供的容器,用於存儲公用用戶,公用用戶可以連接到其他容器,可以查看係統級元數據,這個 Root 容器被命名為 CDB$ROOT.


以下兩種查詢方式顯示了這個 Root 容器的名稱:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

以下查詢整合輸出了CDB的詳細信息:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


② Seed PDB


種子 PDB 是一個係統級模版,CDB 可以用這個模版創建其他 PDB,種子 PDB 的名稱是 PDB$SEED,其中的對象不能被修改。


種子 PDB 數據庫的模板存儲於 $ORACLE_HOME/assistants/dbca/templates/ 目錄下,以壓縮格式提供,其命名為:pdbseed.tar.gz。解壓縮這個文件,其中包含如下幾個文件:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


這其中最為主要的是 SYSTEM 和 SYSAUX 表空間文件,這是一個種子數據庫,已經內置了字典對象,如果使用模板方式建庫,PDB 則由此克隆創建出來。


在創建數據庫時,如果選擇定製數據庫方式創建,則模板文件會自行創建出來,不需要使用模板中的文件。


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


容器 CDB$ROOT 和 PDB$SEED 對於一個插接式數據庫來說是必須的基本組件,這兩者構成了插接式數據庫的基礎支撐。其關係如下圖所示:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


③ PDB


PDB 是用戶基於特定需求建立的對象容器,在創建 CDB 時,可以不同時創建 PDB,PDB 隨後可以根據用戶的需求創立。

 

以下示意圖顯示,CDB 中包含了 CDB$ROOT,PDB$SEED 和兩個用戶 PDB,兩個 PDB 分別用於 SALES 和 HR 業務應用。


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


上圖中,以 USB 移動硬盤的方式表現 PDB,正是突出了 PDB 的 plug 和 unplug 特點,由圖中可以直觀的了解到插接式數據庫的主要特性:

 

  1. 可以通過現有數據庫快速配置和部署新的環境;

  2. 通過 unplug 和 plug 可以快速進行數據庫遷移和整合;

  3. 集中的部署可以加快升級遷移的過程,縮減維護成本;

  4. 方便的整合和拆分方式便於集中部署或在壓力過大時迅速拆分部署;

  5. 分離管理員的職責,強化安全管理;


如上所述,插接式數據庫的一個巨大便利是,可以簡化數據庫的整合遷移,降低管理成本。在一個大型企業中,可能存在幾百上千個數據庫實例,而隨著硬件性能的提升,這些數據庫的資源利用率可能很低,不僅浪費硬件資源,也加重了管理負擔,按照以前版本的功能進行整合或拆分,通常要進行導出導入(Expdp / Impdp 等),不僅複雜,而且涉及很多變更,通常讓人望而生畏。


而如果使用插接式數據庫,則可以輕鬆的將數據庫整合,當負載過高時,又可以遷移至獨立的服務器,整個過程對應用完全透明,主要通過文件複製即可完成,這對於數據庫的分分合合將是一個福音。


3. 元數據的隔離


CDB 與 PDB 的隔離隨之帶來了一係列的好處,如元數據的分離。


在一個 Non-CDB 的數據庫中,數據庫自身的元數據和用戶元數據是混合存儲的,如創建圖示中的 EMP、DEPT 等數據表,其對象信息、表信息等都要存儲在 OBJ$、TAB$ 等數據字典中,這在某些特殊情況下,可能會引起核心數據字典的性能衰減和故障:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

在 CDB 的模式下,由於 PDB 具有獨立的 SYSTEM 和 SYSAUX 表空間,其元數據和係統元數據自然分離,用戶數據的字典信息也就無需再記錄到係統的元數據中,這對於核心的元數據是一種更好的隔離和保護,下圖描述了在 CDB、PDB 模式下用戶數據和元數據的分離關係,其中數據字典元數據也就是 Root Container:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


4. CDB 的內存管理


在內存管理上,SGA 統一分配,PDB 各自的內存對象通過 ID 進行區分,下圖示意了 PDB 的內存管理示意,不同的 PDB 在 SGA 中統一分配內存,通過各自標識進行空間管理和識別(通過ID標識,但是內存是融合管理的):

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

以下來詳細分析一下 Oracle 的 PDB 內存管理。首先啟動數據庫,SGA 在實例啟動過程中創建分配:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


這個測試數據庫中包含如下 PDB:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


初始的,兩個用戶 PDB 並未打開,內存分配情況如下:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


可以看到有三個 Container 分配了一係列的內存條目,這三個容器分別為0、1、2.其中0號容器是 CDB 實例:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


1號 Container 是 CDB$ROOT :


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


如前所述,2號 Container 是 PDB$SEED.

 

查詢 X$BH,可以看到不同 Container 的內存分配:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


打開一個 PDB:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


可以看到相應 Container 的 Buffer Cache 和 Shared Pool 對象等都已經分配:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


繼續打開下一個 PDB,觀察內存分配情況:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


查詢 v$sgastat 視圖可以獲得一個 PDB 的 Shared Pool 內存分配情況:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


同樣 PGA 的內存分配也是通過 CON_ID 區分不同 PDB 的 PGA 內存使用:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


如下通過內存轉儲命令,可以分級轉儲 PDB 的 Buffer Cache 內容:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


可以觀察到對於不同 PDB 的 Buffer Cache 內容轉儲:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


原文鏈接

最後更新:2017-07-18 11:33:28

  上一篇:go  缺乏管理,再好的功能也隻是羈絆
  下一篇:go  Oracle 12c多租戶特性詳解:全局用戶與本地用戶的原理與維護