CDB與PDB是Oracle 12C引入的新特性,在ORACLE 12C資料庫引入的多租使用者環境(Multitenant Environment)中,允許一個資料庫容器(CDB)承載多個可插拔資料庫(PDB)。CDB全稱為ContainerDatabase,中文翻譯為資料庫容器,PDB全稱為Pluggable Database,即可插拔資料庫。在ORACLE 12C之前,執行個體與資料庫是一對一或多對一關系(RAC):即一個執行個體隻能與一個資料庫相關聯,資料庫可以被多個執行個體所加載。而執行個體與資料庫不可能是一對多的關系。當進入ORACLE 12C後,執行個體與資料庫可以是一對多的關系。下面是官方文檔關于CDB與PDB的關系圖。

一個CDB資料庫容器包含了下面一些元件:
ROOT元件
ROOT又叫CDB$ROOT,存儲着ORACLE提供的中繼資料和Common User,中繼資料的一個例子是ORACLE提供的PL/SQL包的源代碼,Common User 是指在每個容器中都存在的使用者。
SEED元件
Seed又叫PDB$SEED,這個是你建立PDBS資料庫的模闆,你不能在Seed中添加或修改一個對象。一個CDB中有且隻能有一個Seed.這個感念,個人感覺非常類似SQL SERVER中的model資料庫。
PDBS
CDB中可以有一個或多個PDBS,PDBS向後相容,可以像以前在資料庫中那樣操作PDBS,這裡指大多數正常操作。
這些元件中的每一個都可以被稱為一個容器。是以,ROOT(根)是一個容器,Seed(種子)是一個容器,每個PDB是一個容器。每個容器在CDB中都有一個獨一無二的的ID和名稱
1.1概念
ORACLE多租戶環境包括一個容器資料庫CDB和一個或多個可插入資料庫PDB。CDB是一組表空間,對外顯示為一個邏輯資料庫。CDB建立後,将至少包括兩個容器。根容器CDB$ROOT是環境容器。一般來說,隻有DBA會連根容器。種子容器PDB$SPEED是一個已提供的隻讀容器,可以複制,可以建立可插入容器(名字随意)。
要點
A.有一個資料庫CDB
B.有一個資料庫執行個體,一個系統全局區(SGA)和一組背景程序
C.PDB隻是一組表空間和一個服務
D.PDB服務通過資料庫偵聽器提供給使用者
E.連結到一個PDB服務時,會話範圍僅限于與PDB相關聯的表空間
F.根容器定義的對象可以有是以PDB共享、通路
G.PDB中定義的對象(包括使用者)PDB私有
H.每個PDB都有自己的資料字典,定義其本地對象,其指針指向在根容器的資料字典中定義的共享對象
特别注意
所有容器必須使用相同的字元集
更新檔應用與根容器
非CDB視圖
USER_
ALL_
DBA
CDB視圖多一個
CDB
非CDB每個資料庫執行個體都有自己的SGA 背景程序和資料庫字典
一個CDB隻有一組背景程序、一個SGA(通常遠小于各個SGA的總和),許多資料庫字典的一個副本,一個ORACLE HOME 節約了資源
1.2CBD和根容器
CDB是資料庫,由執行個體安裝和打開
根容器是管理共享資源的容器,其主要元件如下
控制檔案
undo表空間
redo
執行個體SGA和背景程序
資料字典
公共使用者和角色
根容器至少四個表空間
system、undo、sysaux、temp,它還有傳播到所有PDB的公共使用者和角色,并擁有ORACLE提供的、每個PDB都需要的所有對象。
根容器是唯一一個不通過偵聽連接配接的容器
C:\Users\Administrator>set ORACLE_SID=orclpdb
C:\Users\Administrator>sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on 星期四 12月 14 10:03:02 2017
Copyright (c) 1982, 2016, Oracle. All rights reserved.
連接配接到:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> show con_name
CDB$ROOT
SQL> alter session set container=orclpdb
2 ;
會話已更改。
SQL> show con_name;
CON_NAME
------------------------------ ORCLPDB
2.PDB可插入容器
C:\Users\Administrator>sqlplus pdb2/pdb2@pdb2 as sysdba
SQL> set line 100
SQL> select 'instance: '||instance_name from v$instance
2 union all select 'database: '||name from v$database
3 union all select 'container: '||global_name from global_name;
instance: orcl
database: ORCL container: ORCLPDB
SQL> alter session set container=cdb$root
2 ;
SQL> set line 100 SQL> col name format A20 SQL> select con_id,name from v$containers;
USER 為 "SYSTEM"
X
SQL> select con_id,name,dummy from containers(sys.dual) natural join v$containers;