oracle
12c引入了cdb与pdb的新特性,在oracle 12c数据库引入的多租用户环境(multitenant
environment)中,允许一个数据库容器(cdb)承载多个可插拔数据库(pdb)。cdb全称为container
database,中文翻译为数据库容器,pdb全称为pluggable database,即可插拔数据库。在oracle
12c之前,实例与数据库是一对一或多对一关系(rac):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对
多的关系。当进入oracle 12c后,实例与数据库可以是一对多的关系。下面是官方文档关于cdb与pdb的关系图。
其实大家如果对sql
server比较熟悉的话,这种cdb与pdb是不是感觉和sql
server的单实例多数据库架构是一回事呢。像pdb$seed可以看成是master、msdb等系统数据库,pdbs可以看成用户创建的数据库。而
可插拔的概念与sql server中的用户数据库的分离、附加其实就是那么一回事。看来oracle也“抄袭”了一把sql
server的概念,只是改头换面的包装了一番。
cdb组件(components of a cdb)
一个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)连接到cdb数据库
连接到cdb数据库容器非常简单,跟以前连接数据库是一样的
2)查看数据库是否为cdb
yes表示该数据库是cdb,如果是no表示是no-cdb(普通数据库)
3)查看当前容器(container)
3.1
4)查看cdb容器中的pdbs信息
查看cdb中有多少个pluggable database
5)启动pdb数据库
方式1:
方式2:
6)关闭pdb数据库
sql> alter pluggable database pdbepps close;
pluggable database altered.
sql> select con_id, dbid, guid, name , open_mode from v$pdbs;
con_id dbid guid name open_mode
---------- ---------- -------------------------------- ------------------------------ ----------
2 4071321146 e89e8da2866e3157e043de07a8c09238 pdb$seed read only
3 1930201447 e89e9418b882350ce043de07a8c092b6 pdbepps mounted
sql>
7)在容器间切换
sql> alter session set container=pdbepps;
session altered.
sql> show con_name;
con_name
------------------------------
pdbepps
sql> alter session set container=cdb$root;
cdb$root