文章大纲
容器是多租户容器数据库(CDB)中模式、对象和相关结构的集合,在逻辑上应用程序将其显示为单独的数据库。
在 CDB 中,每个容器都有一个唯一的 ID 和名称,ROOT 和每个 PDB 都被视为一个容器。
PDB 隔离数据和操作,从用户或应用的角度来看,每个 PDB 看起来都是独立的数据库。

CDB ROOT 容器
ROOT 容器是所有 PDB 所属的模式、模式对象和非模式对象的集合。
每个 CDB 有且只有一个 ROOT 容器,被命名为 CDB$ROOT
,用于存储管理 PDB 所需的系统元数据。
PDB
PDB 是用户创建的一组模式、对象和相关结构,在逻辑上对应用显示为单独的数据库。
每个 PDB 都归 sys
所有,sys
是 CDB 中的一个公共用户。
使用 PDB 可以实现以下目标:
- 存储特定应用程序的数据
- 将数据移动到其它 CDB
- 在 PDB 中隔离授权
PDB 有单独的名称空间,对以下结构有影响:
- 模式:一个 PDB 中包含的架构可能与另一个 PDB 中的架构同名,这两个模式可以表示不同的本地用户。
- 对象:对象必须在 PDB 中具有唯一名称,而不是在 CDB 中的所有容器。
应用程序容器是 CDB 中一个可选的、用户创建的容器,用于存储一个或多个应用程序的数据和元数据,一个应用程序容器可以包含多个应用程序 PDB,并允许这些 PDB 共享元数据和数据。



多租户体系结构的好处:
- 降低成本(共享进程、共享系统资源)
- 更容易和更快速的数据和代码的移动
- 更轻松管理和监控物理数据库
- 分离数据和代码
- 安全分离管理权限
- 轻松性能调优
多租户体系结构对管理性的好处:
- 更容易升级数据和代码
- 更容易在服务器之间迁移
- 防止 PDB 中的数据损坏
- 能够在一个地方安装、管理和升级特定于应用程序的数据和元数据
CDB 中表空间和数据文件
CDB 的结构与非 CDB 相同,只是每个 PDB 都有自己的表空间集,包括自己的 SYSTEM、SYSAUX 和 undo 表空间。

CDB 和 PDB 管理
查看数据是否为 CDB:
SYS@orcl(CDB$ROOT)> select cdb from v$database;
CDB
---
YES
创建 PDB:
SYS@orcl(CDB$ROOT)> create pluggable database PDB3 admin user imxcai identified by 123;
Pluggable database created.
SYS@orcl(CDB$ROOT)> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB2 READ WRITE NO
5 PDB3 MOUNTED
查询状态:
SYS@orcl(CDB$ROOT)> col pdb_name format a15
SYS@orcl(CDB$ROOT)> select pdb_name,status from cdb_pdbs;
PDB_NAME STATUS
--------------- ----------
PDB1 NORMAL
PDB$SEED NORMAL
PDB2 NORMAL
PDB3 NORMAL
如果状态为 NEED SYNC
,则需允许
为 PDB 修改名称:
要修改名称的 PDB 一定要处于 opend restricted
状态。
SYS@orcl(CDB$ROOT)> select name,open_mode from v$pdbs;
NAME OPEN_MODE
--------------- ----------
PDB$SEED READ ONLY
PDB1 READ WRITE
PDB2 READ WRITE
PDB3 READ WRITE
SYS@orcl(CDB$ROOT)> alter pluggable database PDB3 close immediate;
Pluggable database altered.
SYS@orcl(CDB$ROOT)> alter pluggable database PDB3 open restricted;
Pluggable database altered.
SYS@orcl(CDB$ROOT)> select name,restricted from v$pdbs;
NAME RES
--------------- ---
PDB$SEED NO
PDB1 NO
PDB2 NO
PDB3 YES
SYS@orcl(CDB$ROOT)> conn sys/oracle@localhost:1521/PDB3 as sysdba
Connected.
SYS@localhost:1521/PDB3(PDB3)> alter pluggable database PDB3 rename global_name to PDB3_new;
Pluggable database altered.
SYS@localhost:1521/PDB3(PDB3)> alter pluggable database close immediate;
Pluggable database altered.
SYS@localhost:1521/PDB3(PDB3)> conn / as sysdba
Connected.
SYS@orcl(CDB$ROOT)> alter pluggable database PDB3_new open;
Pluggable database altered.
SYS@orcl(CDB$ROOT)> select name, open_mode from v$pdbs;
NAME OPEN_MODE
--------------- ----------
PDB$SEED READ ONLY
PDB1 READ WRITE
PDB2 READ WRITE
PDB3_NEW READ WRITE
PDB 删除:
SYS@orcl(CDB$ROOT)> alter pluggable database PDB3_NEW close immediate;
Pluggable database altered.
SYS@orcl(CDB$ROOT)> drop pluggable database PDB3_NEW including datafiles;
Pluggable database dropped.
SYS@orcl(CDB$ROOT)> select name,open_mode from v$pdbs;
NAME OPEN_MODE
--------------- ----------
PDB$SEED READ ONLY
PDB1 READ WRITE
PDB2 READ WRITE