天天看點

多租戶環境

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

CON_NAME

CDB$ROOT

SQL> alter session set container=orclpdb

2 ;

會話已更改。

SQL> show 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:'||INSTANCE_NAME

instance: orcl

database: ORCL

container: PDB2

SQL> conn system/xxxxxxx@orclpdb

已連接配接。

3 union all select 'container: '||global_name from global_name;

database: ORCL container: ORCLPDB

SQL> alter session set container=cdb$root

2 ;

CON_ID NAME           
1 CDB$ROOT
     2 PDB$SEED
             3 ORCLPDB
     4 PDB2
3.1.可插入資料庫的配置
 4種技術
 A.建立一個新的PDB
 B.叢非CDB建立一個PDB
 C.克隆一個新的PDB
 D.插入一個拔出的PDB
 3.2容器間通訊
 SQL> show user;           

------------------------------ CDB$ROOT

SQL> select * from dual;

DU

CON_ID NAME                 DU           
1 CDB$ROOT             X
     3 ORCLPDB              X
     4 PDB2                 X