多租户环境

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都有本身的数据字典,定义其本地对象,其指针指向在根容器的数据字典中定义的共享对象sql

特别注意
全部容器必须使用相同的字符集
补丁应用与根容器
非CDB视图
USER_数据库

ALL_session

DBA
CDB视图多一个
CDB

非CDB每一个数据库实例都有本身的SGA 后台进程和数据库字典
一个CDB只有一组后台进程、一个SGA(一般远小于各个SGA的总和),许多数据库字典的一个副本,一个ORACLE HOME 节约了资源
1.2CBD和根容器ide

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.code

链接到:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Productionorm

SQL> show con_name对象

CON_NAME

CDB$ROOTblog

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

instance: orcl
database: ORCL
container: PDB2
SQL> conn system/xxxxxxx@orclpdb
已链接。
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: 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;

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;

USER 为 "SYSTEM"
SQL> show con_name;

CON_NAME
------------------------------ CDB$ROOT
SQL> select * from dual;
DU

X
SQL> select con_id,name,dummy from containers(sys.dual) natural join v$containers;

CON_ID NAME                 DU

1 CDB$ROOT             X
     3 ORCLPDB              X
     4 PDB2                 X