天天看点

多租户环境

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