12C多租户架构是一个容器数据库(multitenant Container DataBase ,CDB)中包含多个可插拔数据库(PluggableDataBases)。在传统的数据库架构中Oracle实例与数据库的关系是1对1(单实例环境)和1对N(RAC数据库),而在多租户的环境下,实例与数据库的关系为N对1(单实例CDB环境)和N对N(RAC多租户CDB环境)。
简单讲,可插拔数据库(PDB)就像可插拔硬件一样,可以做到即插即用,其实现的逻辑就是将插拔数据库中的数据字典和容器数据库分离,实现快速创建、快速复制、快速迁移等能力。从逻辑上讲,数据库公用控制文件、redo日志、undo表空间,每个可插拔数据库(PDB)都有自己独立的SYSTEM和SYSAUX和临时表空间。
一、PDB的创建和删除
1、PDB的创建有下面几种方法:
从PDB$SEED中创建PDB
通过克隆一个现有的PDB数据库或非CDB数据库(non-CDB)来创建一个新的PDB
使用XML元数据描述文件将数据库插入到CDB中
使用DBMS_PDB方式
CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdb1admin IDENTIFIED BY pdb1admin
STORAGE (MAXSIZE 2G)
DEFAULT TABLESPACE pdb1
DATAFILE '/u01/oracle/oradata/ora12c/pdb1/pdb1.dbf' SIZE 250M AUTOEXTEND ON
PATH_PREFIX = '/u01/oracle/oradata/ora12c/pdb1'
FILE_NAME_CONVERT = ('pdbseed/', '/pdb1/');
以上命令通过从PDB$SEED创建一个名字为pdb1的插入数据库
2、PDB的删除方法:
drop pluggable database pdb1 including datafiles;
以上命令可以删除插入数据库并包含数据文件
注意:其它方式主要应用在现有PDB的复制、不同CDB中PDB的迁移,以及Non-CDB数据库迁移到PDB的方法
二、PDB的启停
打开PDB时,需要以SYSOPER或SYSDBA身份连接到CDB$ROOT,然后发出ALTERPLUGGABLE DATABASE OPEN语句,可以指定一个或多个PDB来打开
启动CDB后执行如下命令启动PDB
alter pluggable database pdb1 open;
启动CDB后启动所用PDB
alter pluggable database all open;
单独关闭PDB
alter pluggable database pdb1 close;
三、其它维护
表空间管理
在多租户数据库环境中,对数据库表空间的管理与传统的非多租户数据库管理基本相同。无论是对用户表空间还是临时表空间,唯一需要注意的是,在对表空间数据文件进行维护的时候,需要确认对象是属于哪个PDB或者是属于CDB$ROOT。
切换PDB
alter session set container=pdb1; —切换到某个PDB
alter session set container=cdb$root; —切换到cdb root
切换后,创建表空间和原来方式一致
用户管理
相比Oracle 11g之前版本中的用户管理,多租户数据库中数据库的管理有两种:本地用户和公共用户。本地用户即为某个PDB中的数据库用户,是仅存在某个PDB中的数据库用户,其管理方法与传统的非CDB环境相同。相比本地用户,公共用户是在多个PDB中具有相同用户名和验证身份的用户。
公共用户的名称不能与所有PDB中任何本地用户名称相同。公共用户是在根和每个现有和将来的PDB中具有相同身份的数据库用户。
本地用户的用户信息保存在属主PDB中的SYSTEM表空间中,而公共用户的用户信息在CDB$ROOT和各个PDB中的SYSTEM表空间中都有保存。
公共用户创建需要在CDB$ROOT根容器下创建:
alter session set container=cdb$root;
create user C##boco identified by oracle
PDB用户创建需要切换到对应容器下创建:
alter session set container=pdb1;
create user pdb1 identified by oracle
管理角色和权限
与公共用户和本地用户类似,在创建角色role的时候,也会有公共角色和本地角色的区别,当在根容器中创建角色时,该角色为公共角色,而在具体某一个PDB中创建角色时,该角色为本地角色。
公共角色可以授予公共用户,也可以授予本地用户。同样,在某一个PDB中,可以给一个公共用户授予公共角色,也可以给它赋予本地角色。所以,公共用户在不同的PDB中的权限可能是不同的。
可以在根容器CDB$ROOT下给所有的公共用户授予公共权限,如果需要赋予一个公共权限,则在赋权SQL命令后面需要加上container=all子句。如下:
grant create table to C##USER1 container=all;
领取专属 10元无门槛券
私享最新 技术干货